我似乎遇到了一个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中更新)
答案 0 :(得分:6)
合并,git或其他(没有错误或不完整的实现),通过查找两个分支的最新共同祖先而不是从那一点开始组合更改。如果双方改变线(以不同的方式),那只是一个冲突。如果只有一方更改了它,则会应用该更改。
在git中,您可以使用git diff HEAD...branch
查看要从合并基础到要合并的分支头的更改,并使用git diff branch...HEAD
从合并基础更改为您的本地主管(通常为git diff
left ...
right 显示 left 和 right 的共同祖先更改为 right < / em>的)。在执行合并之前,这些命令适用于您。事实之后,它将是git diff HEAD^..HEAD^2
和git 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
的更多详细信息