特定のファイルに影響を与える、または関係するすべてのマージコミットを見つけたい。
背景として、マージ時に誰かが競合を誤って解決しましたが、チームは数日間その競合に気づきませんでした。その時点で、他の多くの無関係なマージがコミットされていました(私たちの中には、リベースを使用しないことを好む人もいました。そうしないと、物事はもっと簡単になります)。「悪い」マージコミットを見つける必要があるので、他に何が元に戻されたかを特定するためにチェックできます(もちろん、有罪を特定して罰するために)。
シナリオは次のようになります。
$ 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がマスターにあります。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に影響を与えるすべてのマージコミットを見つけるにはどうすればよいですか?これは、すべての候補マージコミットを手動で検査しなくても可能ですか?