Git错误的无操作合并

时间:2015-09-24 21:07:48

标签: git github merge squash

我在Git中看到一个奇怪的合并失败,因为“压缩”合并到主人。

我创建了一个tiny GitHub repo来重现这个问题。

基本上,这个过程如下:

这里发生了什么?为什么从master返回分支的合并包括直接更改为master分支?这是一个错误还是一个使用错误?

1 个答案:

答案 0 :(得分:1)

这不是错误。问题是您的squash commit不是合并,因此git不知道它已连接到Branch-1。它将其视为普通提交。将master合并到Branch-1后,git会发现自从这些分支出现分歧后发生了以下更改:

  • master中:添加了file1file2,然后删除了file1。整体差异:添加了file2
  • Branch-1中:已添加file1,已添加file2。总体差异:已添加file1file2

Git使用这些整体差异合并分支。您在两个分支中添加了file2,但没有合并冲突,因为来自两个分支的file2是相同的。因此,合并的结果是提交,包含file1file2

出于同样的原因,您的提款请求会将file1添加到master

但是如果你已经完成了真正的合并而不是壁球,那么结果就会如你所愿。

实际上,甚至在git help merge中提到了这一点:

  

使用三向合并的策略(包括默认的递归),如果在两个分支上进行了更改,但稍后在其中一个分支上进行了更改,则该更改将存在在合并结果中;有些人发现这种行为令人困惑。之所以会发生这种情况,是因为在执行合并时只考虑头和合并基础,而不是单个提交。因此,合并算法将恢复的更改视为完全没有更改,而是替换更改后的版本。