Подтвердить что ты не робот

Перечисление слияния, влияющее на файл

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

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

4b9b3361

Ответ 1

Проблема в вашем случае заключается в том, что коммиты слияния пусты, потому что вы берете материал только из одной ветки, поэтому git упрощает историю, удаляя эти "пустые" фиксации.

Итак, чтобы ваши коммиты слияния отображались в журнале, вам нужно сообщить git об изменении упрощения истории, сообщив --simplify-merges. Если вы хотите понять, почему вы должны использовать это, перейдите на страницу git log man, но я не в этом:) Во всяком случае, в этом случае слияние будет правильно показано с фильтрацией a.txt, так что вы хотите.

Наконец, вы хотите показать diff два раза, с каждым родителем, с -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

Ответ 2

Вы можете добавить --merges в команду журнала. Это будет только список коммитов. Кроме того, вы можете указать --first-parent, чтобы вы следовали только истории ветвей и не учитывали историю ветвей, объединенных в нее.