为什么git没有注意到这个内联更改?

时间:2012-01-27 09:08:34

标签: git merge

我似乎遇到了一个git在合并时没有注意到内联更改的情况。

我的主分支有一行文件:

process &block if block

我从git repo中获取了一个,并试图合并来自同一个文件的更改,该文件有一行:

process 1, &block if block

但是git没有对可能发生的合并冲突发出警告,也没有突出显示已更改的行[1]。简单地忽略了更改,而不是使用行[2]更新文件。

为什么git没有注意到这个内联更改?并更新该行(因为该行来自以后的提交)?

修改

[1] - 当我进行冲突解决时,git没有表明它已经改变了(你知道,它没有在它周围的源代码中放入“<<<<”)。并且随后的合并提交不会以任何方式显示更改的行(无论是使用颜色运行gif diff还是查看github上的代码)。

[2] - 该行来自一个repo,它拥有我正在处理的同一个gem的更新版本(所以应该有一些常见的提交祖先用于进行合并。此外,该行更新了后来在同一个repo上提交,所以git应该很明显,这实际上是一个更新)。

修改

如果它扮演角色,这是合并前的提交树:

原始宝石(共同祖先):

--A

我的主分支(实际上是原始宝石的分支):

--A--  
     \  
      --B  

(B中的线未改变,但来自A)

我合并为主人的回购(宝石的更新版本):

--A---C---D

(该行在D中更新)

2 个答案:

答案 0 :(得分:6)

合并,git或其他(没有错误或不完整的实现),通过查找两个分支的最新共同祖先而不是从那一点开始组合更改。如果双方改变线(以不同的方式),那只是一个冲突。如果只有一方更改了它,则会应用该更改。

在git中,您可以使用git diff HEAD...branch查看要从合并基础到要合并的分支头的更改,并使用git diff branch...HEAD从合并基础更改为您的本地主管(通常为git diff left ... right 显示 left right 的共同祖先更改为 right < / em>的)。在执行合并之前,这些命令适用于您。事实之后,它将是git diff HEAD^..HEAD^2git diff HEAD^2..HEAD^HEAD^是第一个父级,HEAD^2是右级父级。)

您还可以通过在上述命令中将git diff替换为gitk来查看自合并基础以来的所有修订,或者只是询问仅使用git merge-base HEAD branch的基础。

答案 1 :(得分:1)

在合并期间,索引包含每个文件的3个版本。

$ git show :1:file.txt  # the file in a common ancestor of both branches  
$ git show :2:file.txt  # the version from HEAD.  
$ git show :3:file.txt  # the version from MERGE_HEAD.  

有关合并here

的更多详细信息