我想找到影响或涉及给定文件的所有合并提交。
对于背景,有人在合并时错误地解决了冲突,并且团队几天没有注意到它。在那时,许多其他不相关的合并已经被提交(我们中的一些人更喜欢不使用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的所有合并提交?如果不手动检查所有候选合并提交,这是否可行?
答案 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
,以便您只遵循分支历史记录,而不考虑合并到其中的分支的历史记录。