我在操作 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操作(合并到本地分支)产生的。