Как проверить ручное разрешение конфликтов в коммитах слияния, где разрешение выполняется чисто с использованием одного из родителей

Рассмотрим следующий журнал git со следующими коммитами

6752364 *   Merge branch 'java-branch'
        |\  
b9e9e66 | * Add an unrelated file
14a7cb9 | * Change favorite language to Java
7b07a43 * | Change favorite language to C#
        |/  
8788146 * C++ is my favorite programming language

Вы можете клонировать репозиторий, который я сделал в качестве примера для этого вопроса.

Моя цель — проверить, какое разрешение конфликта слияния было выполнено в коммите слияния 6752364. Например, я сделал это слияние, поэтому я знаю, что мне было предложено разрешить конфликт в файле readme.md, который я сделал с помощью Meld. Я выбрал версию Java вместо версии С#. Я не вижу, чтобы это решение было записано где-либо в коммите слияния (не так, чтобы его можно было легко проверить, по крайней мере, подробнее об этом позже). Все, что я могу проверить, это конечное состояние файла.

Есть несколько ответов в StackOverflow относительно этой проблемы просто говорят, что я должен использовать git show для проверки того, какое разрешение было выполнено. Однако мой git show дает мне этот вывод:

commit 6752364571d0e9c89ddbb3bd287af2e26eb23e59 (HEAD -> master, origin/master)
Merge: 7b07a43 b9e9e66
Author: Henrique Jung <[email protected]>
Date:   Sun Oct 4 21:18:54 2020 +0200

    Merge branch 'java-branch'

Я предполагаю, что git show полезен только в том случае, если я решил конфликт, не используя родительский коммит, а скорее третью версию, недоступную ни для одного из них (например, при написании Haskell на Meld). Как я могу проверить фиксацию слияния, в которой разрешение конфликта выполняется с использованием одной из версий, то есть напрямую выбирая родителя A или родителя B? Где записано, что я предпочитаю Java C#?

Моя версия git 2.25.1.


Возможно, вы думаете: ну, я могу просто посмотреть коммит на GitHub или, может быть, gitg, который показывает мне разницу. Но есть одна загвоздка: он показывает все различия. Он показывает несвязанный файл, который никогда не был частью разрешения конфликта. Таким образом, я мог бы проверить разрешение, но для больших слияний это добавило бы много шума, я бы снова просмотрел обе ветки.

Этот вопрос возник, когда я просматривал большое слияние с большим количеством разрешений конфликтов, и все ответы, связанные с git show, оказались не такими, как я хотел. Единственный способ надежно проверить, в каких файлах конфликты разрешены вручную, — это повторить слияние локально. Очевидно, должен быть лучший способ.


person Henrique Jung    schedule 04.10.2020    source источник
comment
Git не записывает такие метаданные, коммит слияния просто содержит разрешенное дерево и указатели на родительские коммиты.   -  person ephemient    schedule 04.10.2020
comment
Используйте git show -m, чтобы получить diff для каждого из двух родителей слияния. (И/или см. ответ jthill.)   -  person torek    schedule 05.10.2020


Ответы (1)


merge=6752364571d0e9c89ddbb3bd287af2e26eb23e59
git checkout $merge^1
git merge $merge^2
git diff $merge

сделает это, если вы не используете автоматическое повторное использование записанных разрешений конфликтов; если да, добавьте -c rerere.enabled=false в качестве опции git при слиянии.

person jthill    schedule 04.10.2020
comment
Спасибо за ответ. Я предполагаю, что повторное слияние локально - лучший вариант. Спасибо за предоставление команд в понятной форме. - person Henrique Jung; 10.10.2020