如何从分歧提交中查看文件的修改历史记录

时间:2017-11-29 10:56:42

标签: git

我正在尝试将分支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

生成了提交列表。现在我需要得到差异。

2 个答案:

答案 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 mergegit 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)

似乎要走的路是:

1)找到共同基础:

base=$(git merge-base L U)

2)获取从当前分支HEAD到基础提交的差异或提交列表:

git log base..L --full-diff -p A.txt
git log base..L --follow A.txt

如果使用JetBrains的IDE,可以这样看:

enter image description here