列出影响文件的合并提交

Gre*_*ast 25 git git-merge git-log git-branch

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

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

...所以现在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'
Run Code Online (Sandbox Code Playgroud)

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

$ 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 
Run Code Online (Sandbox Code Playgroud)

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

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

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

$ git log --decorate --oneline --follow a.txt
...
Run Code Online (Sandbox Code Playgroud)

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

$ git log --oneline --graph --decorate a1..master
...
Run Code Online (Sandbox Code Playgroud)

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

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

Cha*_*esB 25

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

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

最后,你想要与每个父母一起展示两次diff -m.

所以这给了

git log -U -m --simplify-merges --merges -- a.txt
Run Code Online (Sandbox Code Playgroud)

与输出

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
Run Code Online (Sandbox Code Playgroud)