我们最近在尝试合并两个分支时遇到了一个非常奇怪的问题。情况归结为以下几点:
B
是一个长期存在的分支,我们要合并回主干B
,其中有一些其他提交A
中的A
和B
中的git checkout A; git merge B
合并回A
A
时,我们遇到与B
引入的更改无关的合并冲突:这些冲突位于一堆文件中,这些文件可能不受git annotate
的影响,但在git log
中已更改{1}} 1234
和1234
跟踪其中一个冲突文件的祖先,我们有效地注意到冲突的位置有一个共同的提交祖先A
:一行用{{注释1}} 5678
和B
git annotate file1 5678^
但1234
显示{{1}}的冲突行。我不明白这是怎么可能的,并且无法在任何地方找到类似问题的任何线索。
答案 0 :(得分:1)
在分支A
的共同祖先之后,应在分支B
上更改冲突文件。您可以再次git annotate
和git log
仔细检查。
git annotate filename A
git annotate filename B
注意: git annotate
中的提交列表从旧的(在顶部)到新的(在底部)排序。
假设输出命令如下:
$ git annotate filename A
commit A1
commit A2
commit common
commit A3
commit A4
$ git annotate filename B
commit B1
commit B2
commit B3
commit common
commit B4
这意味着,在提交祖先commit common
之后,冲突文件在提交A3
中更改,并在分支A4
中提交A
;在分支B
中,冲突文件在commit B4
之后发生了变化。
您可以使用以下命令显示通过图表更改冲突文件的提交:
git log --oneline --decorate --graph --all -- filename
然后图表如下所示:
* commit A4 (branch A)
* commit A3
| * commit B4 (branch B)
* | commit Common
| \
* | commit A2
* | commit A1
| * commit B3
| * commit B2
| * commit B1
| |
… …