git - git pull --rebase 默默地忽略变基冲突
问题描述
有人将此标记为重复,但它没有说明原因git rebase
,因为没有冲突而git pull
有
我有同一个 repo 的两个克隆,C1
并且C2
它们的 HEAD 都在提交时M1
,对 file 有一些更改F
。
假设没有.gitconfig
文件,并且.git/config
该文件是默认生成的git
在C1
- 我修改
F
(在同一个地方M1
修改F
) git commit -a --amend --no-edit
重写M1
,这会导致新的提交M2
。git push -f
覆盖遥控器。
在C2
- 我愿意
git fetch
。所以origin/master == M2
一会儿HEAD == M1
由于M1
和M2
都已修改F
,以下任何命令都将进入merge conflict
状态:
git merge origin/master
git merge
git rebase origin/master
git pull
但是,以下命令不会触发merge conflicts
并设置HEAD
为M2
git rebase
git pull --rebase
问题
- 这种行为在设计上是正确的吗?
git rebase
和有什么区别git rebase origin/master
- 做什么
git pull --rebase
?
以前,我一直以为
git pull
是相同的git fetch && git merge origin/master
git pull --rebase
是相同的git fetch && git rebase origin/master
但是这个实验使我的想法无效。
即使我M3
在上面提交另一个M2
并推入,情况也不会改变C1
。在C2
它仍然会重置为M3
并且M1
丢失。
解决方案
git merge 尝试查看点 M1 和 C1 之间的差异以及点 M1 和 C2 之间的差异,并将它们合并在一起。
git rebase 将您置于 M2 点,然后应用从点 M1 到点 C2 的每个更改,这些更改也不在顺序上到点 M2 的路径上。采用这种方法,它能够更好地理解什么是相关的,什么不是相关的,所以在合并方法中看起来像冲突的许多事情都更容易解决。
虽然许多开发人员似乎喜欢尽可能少地提交,但当涉及的每个提交都很小时, git rebase 实际上效果最好。对我来说,这一切都像是魔法,直到我尝试在 CVS 存储库上手动做同样的事情。同事 A 的更改,这只是一个单一的提交,并不能更容易地应用 rebase 概念,因为它是一回事。但是切换到他的更新,并应用同事 B 的几十个微小提交,效果很好,可以准确地显示每次更新的目的。
推荐阅读
- dependencies - CPack RPM 将库放在“提供”和“需要”列表中
- sql - 将字符串转换为 db2 中的日期
- java - 在 main() 方法中调用多个方法(int)
- java - 应用程序在显示加载屏幕时横向崩溃
- javascript - 有没有办法在 Typescript 的包装函数中动态键入函数?
- python - Pythonic 方法在子午线上对经度数组进行切片
- python - 令人愉悦的彩色地图,可以高精度读取
- angular - 在应用组件中获取重定向信息
- dataframe - PySpark DataFrame 列参考:df.col vs. df['col'] vs. F.col('col')?
- go - 如何强制 Goland 每次都运行测试?