首页 > 解决方案 > `git pull --rebase` 如何正确拉取修改后的提交?

问题描述

我有一个设置,我在我的机器上编码并从我的盒子local里拉出来测试它。dev假设我A在分支foo上创建了一个提交local,并foo在开发盒上创建了一个分支,其上游设置为local/foo. 如果我在开发框上执行git pullfrom 分支,则分支树将变为与.foodev/foolocal/foo

但是,如果我现在修改 中的提交A,则从 dev 框local/foogit pull的分支foo会产生合并冲突。而git pull --rebase工作正常并且不会重复提交A两次dev/foo.

git help pull说:

       -r, --rebase[=false|true|merges|preserve|interactive]
           When true, rebase the current branch on top of the upstream branch after 
fetching. If there is a remote-tracking branch corresponding to the upstream branch 
and the upstream branch was rebased since last fetched, the rebase uses that 
information to avoid rebasing non-local changes.

我知道在上述场景中应用了最后一行,但我不明白先决条件是什么或它是如何工作的?

一个解释会很有帮助。谢谢

标签: gitgit-pull

解决方案


这是因为合并和变基的区别。

“常规”git pull首先获取更改,然后将它们合并到本地状态,同时git pull --rebase 获取更改,然后将本地状态重新定位在远程状态之上。

合并只考虑项目的两种状态——合并的“我们的”和“他们的”一方,如果可能的话,还考虑它们的所谓“合并基础”——这些开发线共享的最后一个共同提交。

相反,变基首先将“我们的”端重置为指向“他们的”端在其尖端的相同提交,然后应用每个“我们的”提交“他们的”没有 单独的——作为文本补丁,一个——一个。

当本地更改以增量方式重新应用到远程的更新状态时,这可能更有可能不产生冲突。


推荐阅读