Я хочу найти все коммиты слияния, которые влияют или связаны с данным файлом.
Для фона кто-то неправильно разрешил конфликт при слиянии, и он не был замечен командой в течение нескольких дней. В этот момент было сделано много других несвязанных слияний (некоторые из нас предпочли не использовать 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
... Итак, теперь есть конфликтующие изменения в a.txt в master и branch1.
$ 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
Хорошо, поэтому ни а1, ни комманда не появляются.
$ git log --decorate --oneline --follow a.txt
...
Это показывает мне все на обеих ветвях, но все же опускает коммитацию.
$ git log --oneline --graph --decorate a1..master
...
Это, конечно, "все в мастер не в a1", которое работает на этом примере игрушек, но в моем реальном случае дает мне все сделанные недавно слияния (и никаких указаний на то, что один коснулся a.txt).
Я могу рационализировать исчезновение a1 из истории файлов, так как слияние решило опустить это изменение (по крайней мере, в том смысле, что git волнует, я думаю). Но как я могу найти все коммиты слияния, влияющие на a.txt? Возможно ли это даже без ручного контроля всех коммандов слияния?