26

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

作为背景,有人在合并时错误解决了冲突,并且几天没有被团队注意到。那时,已经提交了许多其他不相关的合并(我们中的一些人一直更喜欢不使用 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
...

这当然是“master not in a1 中的所有内容”,它在这个玩具示例中有效,但在我的真实案例中,为我提供了最近完成的所有合并(并且没有迹象表明哪一个接触了 a.txt)。

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

4

2 回答 2

25

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

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

最后,您想显示 diff 两次,每个父级,使用-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
于 2012-04-16T21:02:51.070 回答
2

您可以添加--merges到日志命令。这只会列出合并提交。此外,您可以指定--first-parent只关注分支历史,而不考虑合并到其中的分支的历史。

于 2012-04-16T20:08:31.670 回答