git pull 拉取非当前分支时发生冲突

git pull 拉取非当前分支时发生冲突

我在操作 git pull 时遇到问题。假设我的远程(原始)存储库上有 2 个分支:A 和 B。

远程 B 分支领先本地 B 分支 1 次提交。

这个额外的提交(在远程 B 分支上)只是添加了一个新文件,比如“newfile”。

在我的本地分支 A 中,我有一个文件“newfile”,其内容与远程 B 分支的内容不同。

然后,我运行以下命令:

git checkout A
git pull origin B:B

我可以看到以下行为:分支 B 按照我的预期进行了更新。B 已快进,然后包含“newfile”。但我在“newfile”上也存在冲突。并且在我的当前目录中,文件“newfile”包含冲突标记。

为什么合并已经完成还会有冲突?

谢谢。

答案1

当您执行拉取时,(默认情况下)它会获取所有可以获取的内容,而不会覆盖您所做的任何更改。由于必须修改您的编辑而无法获取的任何内容都被视为冲突。冲突需要手动解决,或者您可以撤消更改并执行另一次拉取。完成合并后,您可以执行推送以提交更改。

这是默认行为,因为想想如果它不这样做会有多糟糕 - 您的更改可能会在未经您许可的情况下被取消。

答案2

我想我误解了 git pull 的语义。我认为:

git pull origin B:B

意思是:

fetch the remote B 
         + 
merge the remote B into the local B

我意识到它的意思是:

fetch the remote B and updates (if fast-forward is possible)  the local B
             +
merge the remote B into the local branch

实际上 git pull 总是会将其合并到本地分支中,与 refspec 无关。

也就是说,pull = fetch + merge。本地B分支的更新是通过“fetch”完成的,而冲突则是通过后面的merge操作(合并到本地分支)产生的。

相关内容