`git show` дает запутанные результаты при коммитах слияния - PullRequest
1 голос
/ 19 июня 2019

Я всегда понимал, 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.

Ответы [ 2 ]

1 голос
/ 20 июня 2019

git show создает комбинированные различия по умолчанию. (Это улучшение по сравнению с git log -p, которое для коммитов слияния выдает вообще без различий по умолчанию!)

Комбинированные различия документированы - на мой взгляд, несколько плохо - в двух отдельных разделах, которые отображаются на нескольких страницах руководства по git diff для команд. Вот два критических раздела из документации git diff-tree:

Первая секция, расположенная около дна, имеет следующее предупреждение:

Обратите внимание, что комбинированный diff содержит только файлы, которые были изменены от всех родителей.

Вероятно, это должен быть жирный шрифт, 18-точечный шрифт и / или мигание, а не достаточно далеко от секции second , которая говорит вам, как читать выходные данные. (В описании -p есть свой собственный раздел между этими двумя. Кроме того, в первом разделе говорится о вещах из строки режима, но тот факт, что многие файлы опущены полностью, относится ко второму разделу, просто не упоминается в второй раздел.)

Я думаю, что цель здесь состоит в том, чтобы сделать вывод по умолчанию git show, показывающий, где кто-то мог решить конфликт. Обычно это хорошая идея, но иногда вы действительно хотите git show -m, который просто показывает один diff против первого родителя, а затем второй diff против второго родителя.

0 голосов
/ 19 июня 2019

git show покажет разницу в случае разрешения конфликта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...