我正在尝试将分支U
合并到分支L
中。假设我的文件A.txt
存在冲突。我想从遥控器中获取所有更改,并手动添加本地所做的所有更改。我知道git将3-way-merge应用于一个基本提交。所以我基本上需要一个自基数以来所有修改(历史)的列表。我怎么才能得到它?我的逻辑是否正确?
我运行了git merge-base L U
并确定了公共基础14b394adb
。我知道我可以使用git log --follow A.txt
获取文件的所有历史记录。所以我申请了这个:
git log 14b394adba..cb5c3b80fe --follow A.txt
生成了提交列表。现在我需要得到差异。
答案 0 :(得分:2)
正如您在自己的回答中所述,将-p
添加到git log --follow
会显示git log --follow
显示的每次提交的每个差异。
请注意--follow
一次重命名一个提交;但git merge
不。 1 例如,假设你有:
L1--L2--...--Ln <-- L (HEAD)
/
...--o--B
\
o--o <-- U
这里所有 L i 提交在顶行,经过合并基地 B ,是(仅){{1分支(图中的其他提交在L
或两者上)。运行:
U
将commit L n-1 与commit L n 进行比较,检查是否{{1这是在这个差异中重命名的结果。如果是这样,它将选择一个新名称来寻找;在任何一种情况下,它现在比较 L n-2 vs L n-1 。重复此过程直到它比较 L 1 vs L 2 ,最后比较 B vs L 1 。
现在假设,git log --follow B..L -- A.txt
和A.txt
之间的结尾发生了一些中等大的变化,导致intermediate.txt
提前开始查看A.txt
,然后是另一个对链条开头的中等大变化 - 或者是一系列此类变化 - 这使得Git认为git log --follow
是重命名intermediate.txt
的结果。
另一方面,intermediate.txt
只是在运行:
original.txt
在这里,因为有很多相当大的变化,git merge
与git diff --find-renames B Ln
非常不同,而Git 不选择它作为“相同文件”提交 B 和 L n 。合并将不会将这两个视为“相同文件”,并且original.txt
不将成为合并的 L 方的基本版本。 (在这种情况下,A.txt
很可能被视为一个新文件,而不是一个修改过的文件,但有一些情况并非如此。)
因此,如果您这样做是为了将Git认为成为 original.txt
的合并基础版本与A.txt
的提示L侧版本进行比较,你只想要一个:
A.txt
1 我认为应该,或者至少应该有一个标志(也许是A.txt
!)来做到这一点。但事实并非如此。
答案 1 :(得分:0)