Как «показать» коммит слияния с комбинированным выводом diff, даже если каждый измененный файл согласовывается с одним из родителей? - PullRequest
169 голосов
/ 22 февраля 2011

После выполнения «простого» слияния (без конфликтов), git show обычно показывает только что-то вроде

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

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

Есть ли способ заставить git по-прежнему показывать все различия в комбинированном режиме сравнения?

Выполнение git show -m покажет различия (с использованием попарных различий между новой и всеми родительскими версиями соответственно), но я бы предпочел иметь это с различиями, отмеченными +/- в соответствующих столбцах, как в комбинированном режиме.

Ответы [ 11 ]

232 голосов
/ 07 сентября 2011

Посмотрите на сообщение фиксации:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

обратите внимание на строку:

Merge: fc17405 ee2de56

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

git diff ee2de56..fc17405

, чтобы показать только имена измененных файлов:

git diff --name-only ee2de56..fc17405

и извлечь их, вы можете добавитьэто для вашего gitconfig:

exportfiles = !sh -c 'git diff $0 --name-only | "while read files; do mkdir -p \"$1/$(dirname $files)\"; cp -vf $files $1/$(dirname $files); done"'

, затем используйте его, выполнив:

git exportfiles ee2de56..fc17405 /c/temp/myproject
61 голосов
/ 01 июня 2016

Лучшее решение (упомянутое @KrisNuttycombe):

git diff fc17405...ee2de56

для коммита слияния:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

, чтобы показать все изменения на ee2de56, которые достижимы из коммитов на fc17405. Обратите внимание на порядок хэшей фиксации - он такой же, как показано в информации о слиянии: Merge: fc17405 ee2de56

Также обратите внимание на 3 точки ... вместо двух !

Для получения списка измененных файлов вы можете использовать:

git diff fc17405...ee2de56 --name-only
11 голосов
/ 10 декабря 2012

Вы можете создать ветку с HEAD, установленным в один коммит перед слиянием. Затем вы можете сделать:

git merge --squash testing

Это слит, но не фиксирует. Тогда:

git diff
5 голосов
/ 25 февраля 2011

Нет, с git show нет способа сделать это. Но иногда это было бы неплохо, и, вероятно, это было бы относительно легко реализовать в исходном коде git (в конце концов, вам просто нужно сказать, чтобы не обрезал то, что он считает посторонним выводом), так что патч для этого, вероятно, будет принят сопровождающими git.

Будьте осторожны с тем, что вы желаете; объединение ветки с изменением в одну строку, которое было отменено три месяца назад, все равно будет иметь огромный diff по сравнению с основной линией, и поэтому такой полный diff будет почти бесполезным. Вот почему Git не показывает это.

4 голосов
/ 27 марта 2015

Похоже, здесь ответили: http://thread.gmane.org/gmane.comp.version-control.git/191553/focus=191557

Таким же образом, работает

$ git diff --cc $ M $ M ^ 1 $ M ^ 2 $ (git merge-base $ M ^ 1 $ M ^ 2)

должен показывать комбинированный патч, который объясняет состояние в $ M относительно Штаты записали в своих родителях и базе слияния.

4 голосов
/ 22 февраля 2011

Я думаю, вам просто нужно git show -c $ ref. Попытка сделать это в репозитории git на a8e4a59 показывает комбинированный diff (плюс / минус символы в одном из 2 столбцов). Как упоминается в руководстве по git-show, оно в значительной степени делегирует «git diff-tree», поэтому эти параметры выглядят полезными.

3 голосов
/ 04 июня 2013

в вашем случае вам просто нужно

git diff HEAD^ HEAD^2

или просто хеш для фиксации:

git diff 0e1329e55^ 0e1329e55^2
2 голосов
/ 04 октября 2018

Если ваш коммит слияния является коммитом 0e1329e5, как указано выше, вы можете получить diff, который содержался в этом слиянии:

git diff 0e1329e5^..0e1329e5

Надеюсь, это поможет!

1 голос
/ 13 мая 2019

Если вы сидите на коммите слияния, то здесь отображаются различия:

git diff HEAD~1..HEAD

Если вы не на коммите слияния, просто замените HEAD на коммит слияния.Этот метод кажется самым простым и интуитивно понятным.

1 голос
/ 15 января 2018

Вы можете использовать команду diff-tree с флагом -c. Эта команда показывает, какие файлы были изменены в коммите слияния.

git diff-tree -c {merged_commit_sha}

Я получил описание флага -c от Git-Scm :

Этот флаг изменяет способ отображения коммита слияния (что означает, что полезно только тогда, когда команде дается один, или --stdin). Это показывает различия от каждого из родителей к результату слияния одновременно вместо показа попарного различий между родителем и результат по одному (что и делает опция -m). Кроме того, в нем перечислены только файлы, которые были изменены от всех родителей.

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