Список коммитов слияния, влияющих на файл

Я хочу найти все коммиты слияния, которые влияют на данный файл или связаны с ним.

Для справки: кто-то неправильно-разрешил конфликт при слиянии, и команда не замечала этого в течение нескольких дней. На тот момент было совершено много других несвязанных слияний, (некоторые из нас предпочитали не использовать 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

...Итак, теперь есть конфликтующие изменения в файле.txt в мастере и ветке1.

$ 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 

На данный момент неправильная версия файла.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», что работает в этом игрушечном примере, но в моем реальном случае дает мне все слияния, сделанные недавно (и без указания того, какой из них коснулся.txt).

Я могу объяснить исчезновение a1 из истории файла, так как слияние решило пропустить это изменение (по крайней мере, в том смысле, в котором git заботится, я думаю). Но как найти все коммиты слияния, влияющие на файл.txt? Возможно ли это вообще без ручной проверки всех коммитов слияния кандидатов?

25
задан Greg Fast 16 April 2012 в 19:57
поделиться