我在Git中看到一个奇怪的合并失败,因为“压缩”合并到主人。
我创建了一个tiny GitHub repo来重现这个问题。
基本上,这个过程如下:
merge --squash
'd these commits into master。这里发生了什么?为什么从master返回分支的合并包括直接更改为master分支?这是一个错误还是一个使用错误?
答案 0 :(得分:1)
这不是错误。问题是您的squash commit不是合并,因此git不知道它已连接到Branch-1
。它将其视为普通提交。将master
合并到Branch-1
后,git会发现自从这些分支出现分歧后发生了以下更改:
master
中:添加了file1
和file2
,然后删除了file1
。整体差异:添加了file2
。Branch-1
中:已添加file1
,已添加file2
。总体差异:已添加file1
和file2
。 Git使用这些整体差异合并分支。您在两个分支中添加了file2
,但没有合并冲突,因为来自两个分支的file2
是相同的。因此,合并的结果是提交,包含file1
和file2
。
出于同样的原因,您的提款请求会将file1
添加到master
。
但是如果你已经完成了真正的合并而不是壁球,那么结果就会如你所愿。
实际上,甚至在git help merge中提到了这一点:
使用三向合并的策略(包括默认的递归),如果在两个分支上进行了更改,但稍后在其中一个分支上进行了更改,则该更改将存在在合并结果中;有些人发现这种行为令人困惑。之所以会发生这种情况,是因为在执行合并时只考虑头和合并基础,而不是单个提交。因此,合并算法将恢复的更改视为完全没有更改,而是替换更改后的版本。