列出影响文件的合并提交

时间:2012-04-16 19:57:05

标签: git git-branch git-merge git-log

我想找到影响或涉及给定文件的所有合并提交。

对于背景,有人在合并时错误地解决了冲突,并且团队几天没有注意到它。在那时,许多其他不相关的合并已经被提交(我们中的一些人更喜欢不使用rebase,或者事情会更简单)。我需要找到“坏”合并提交,因此可以检查它以确定还原的其他内容(当然,还要确定并惩罚有罪的人)。

场景是这样的:

$ echo First > a.txt && git add a.txt && git commit -m 'First commit'
$ git branch branch1
$ echo "Second: main-branch" >> a.txt && git commit -a -m 'Commit on master'
$ git tag a1
$ echo "Third: main" >> a.txt && git commit -a -m 'Other commit on master'
$ git checkout branch1
$ echo "Second: on branch1" >> a.txt && git commit -a -m 'Commit on branch'
$ git tag b1

...所以现在master和branch1中的a.txt发生了冲突的变化。

$ git checkout master
$ git merge branch1 
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
$ cat a.txt 
First
<<<<<<< HEAD:a.txt
Second: main-branch
Third: main
=======
Second: on branch1
>>>>>>> branch1:a.txt
$ vi a.txt
# ...
$ cat a.txt 
First
Second: on branch1
$ git add a.txt
$ git commit -m 'Merge commit'

......换句话说,决议是“拿走他们的”。该图现在看起来像这样:

$ git log --graph --branches --format='%h %s %d' 
*   fefb623 Merge commit  (refs/heads/master)
|\  
| * 93e065e Commit on branch  (refs/tags/b1, refs/heads/branch1)
* | cf4d12b Other commit on master 
* | 6fade67 Commit on master  (refs/tags/a1)
|/  
* 07545ea First commit 

此时a.txt的错误版本在master上。 a1中的版本是我们想要的,但是b1版本已经提交了。到目前为止,我已经尝试过:

$ git log --decorate --oneline a.txt
93e065e (refs/tags/b1, refs/heads/branch1) Commit on branch
07545ea First commit

好的,所以既不会出现a1也不会出现合并提交。

$ git log --decorate --oneline --follow a.txt
...

这显示了两个分支上的所有内容,但仍然省略了合并提交。

$ git log --oneline --graph --decorate a1..master
...

这当然是“主人不在a1中的一切”,这在这个玩具示例中起作用,但在我的实际案例中给了我最近完成的所有合并(并没有指示哪个触及a.txt)。

我可以从文件的历史中合理化a1的消失,因为合并选择省略了这种改变(至少在git关心的意义上,我认为)。但是如何找到影响a.txt的所有合并提交?如果不手动检查所有候选合并提交,这是否可行?

2 个答案:

答案 0 :(得分:23)

你的情况下的问题是合并提交是空的,因为你只从一个分支获取东西,所以git通过删除那些“空”提交来简化历史。

因此,为了让日志中显示您的合并提交,您需要通过告诉--simplify-merges告诉git更改历史记录简化。如果你想了解为什么必须使用它,请继续git log手册页,但我已经不在了:)无论如何,在这种情况下,合并提交正确显示了a.txt过滤,所以这就是你想要的。

最后,您希望使用-m向每个父级显示两次差异。

所以这给了

git log -U -m --simplify-merges --merges -- a.txt

带输出

commit a7340d6e91deedff6f52c8ec8da932245f73e5f6 (from d577e6c4dcbff5485ded666c89f38
Merge: d577e6c fe3c4d2

    merge commit

diff --git a/a.txt b/a.txt
index 319137b..1aa6dc4 100644
--- a/a.txt
+++ b/a.txt
@@ -1,3 +1,2 @@
 First
-Second: main-branch
-Third: main
+Second: on branch1

答案 1 :(得分:3)

您可以将--merges添加到log命令。这只会列出合并提交。此外,您可以指定--first-parent,以便您只遵循分支历史记录,而不考虑合并到其中的分支的历史记录。