Я всегда понимал, git show
, чтобы никогда не показывать различия при коммите слияния. Вероятно, по той же причине git log -p
не показывает различия при фиксации слияния. Тем не менее, я могу создать два воспроизводимых сценария: коммит слияния, который делает , создает diff с git show
и тот, который не делает. Я хотел бы понять, почему поведение git show
отличается между этими сценариями.
Во-первых, я запустил скрипт, который создает хранилище, необходимое для соблюдения двух вышеописанных сценариев:
#!/usr/bin/env bash
set -ex
git init test_repo
cd test_repo
# master (commit 1)
printf "one\n" > file.txt
git add file.txt
git commit -m one
# master (commit 2)
printf "two\n" >> file.txt
git commit -am two
# master (commit 3)
printf "three\n" >> file.txt
git commit -am three
# topic1 (commit 1)
git checkout -b topic1 @^
printf "four\n" >> file.txt
git commit -am four
# merge topic1 to master (commit 4)
git checkout master
git merge - || true # conflict
printf "one\ntwo\nthree\nfour\n" > file.txt
git add file.txt
git commit --no-edit
git tag merge1 # tag so we can refer to it in examples
# master (commit 5)
printf "five\n" >> file.txt
git commit -am five
# topic2 (commit 1)
git checkout -b topic2
printf "six\n" >> file.txt
git commit -am six
# merge topic2 to master (commit 6)
git checkout master
git merge --no-edit - # no conflict
git tag merge2 # tag so we can refer to it in examples
Сценарий 1: git show
показывает разницу:
$ cd test_repo
$ git show merge1
commit cb7aba11aed80917e3fac64e60aef3fe0a27e5de (tag: merge1)
Merge: 75bae65 5f63df7
Author: John Doe <john.doe@domain.com>
Date: Wed Jun 19 14:05:34 2019 -0500
Merge branch 'topic1'
# Conflicts:
# file.txt
diff --cc file.txt
index 4cb29ea,87a123c..f384549
--- file.txt
+++ file.txt
@@@ -1,3 -1,3 +1,4 @@@
one
two
+three
+ four
Сценарий 2: git show
не не показывает разницу:
$ cd test_repo
$ git show merge2
commit 5f37be9b563afc9c9f43ad04198d80809e6fc13a (HEAD -> master, tag: merge2)
Merge: 6f4cf36 bde33e8
Author: John Doe <john.doe@domain.com>
Date: Wed Jun 19 14:05:34 2019 -0500
Merge branch 'topic2'
Основное различие между двумя сценариями (например, merge1
и merge2
) состоит в том, что merge2^
относится к базе слияния topic2
и master
(до слияния), а merge1^
является уникальным коммит без слияния. Я не уверен, имеет ли значение этот промежуточный коммит между базой слияния и коммитом слияния, но я не могу думать ни о чем другом, как могло бы быть. Кто-нибудь может объяснить эту разницу в поведении?
Я ожидаю, что git show merge1
не показывает различий. Насколько мне известно, git show merge2
вывод правильный, а git show merge1
неверный (глючный).
Версия Git 2.22.0 для Windows.