我想找到影响或涉及给定文件的所有合并提交。
作为背景,有人在合并时错误解决了冲突,并且几天没有被团队注意到。那时,已经提交了许多其他不相关的合并(我们中的一些人一直更喜欢不使用 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 的所有合并提交?如果不手动检查所有候选合并提交,这甚至可能吗?