git bisect
, как предлагается в другом ответе, безусловно, очень полезно для отслеживания того, какой коммит привел к ошибке, и может очень быстро найти вашу проблему. Вполне возможно, что коммит слияния может быть виноват, однако, и в любом случае, возможно, прямой ответ на ваш вопрос может быть интересен.
Во-первых, вы должны найти имя объекта (т.е. сумму SHA1) интересующего вас коммита слияния, возможно, с git log --graph --pretty=oneline
или gitk
- скажем, имя объекта этого коммита слияния начинается с d8fa
для этот пример.
В git коммиты определяются в виде полного снимка дерева, а не изменений в дереве, и это так же верно для слияний с двумя (или более) родителями, как и любой другой коммит. Итак, возможно, самый очевидный вопрос, который нужно задать о том, что было изменено коммитом слияния, это «что изменилось по отношению к каждому родителю этого слияния?» Вы можете ссылаться на первого родителя как d8fa^1
, а второго родителя как d8fa^2
, чтобы вы могли видеть, какие файлы изменились по отношению к каждому с помощью:
git diff --stat d8fa^1 d8fa
... и:
git diff --stat d8fa^2 d8fa
Или вы можете увидеть их обоих сразу:
git whatchanged -1 -m --stat d8fa
(Вы можете изменить --stat
на -p
, чтобы видеть полные различия вместо diffstat с git whatchanged
, или просто пропустить --stat
с git diff
. Если вы просто хотите увидеть один файл diff против одного родителя, вы можете сделать git diff d8fa^1 d8fa -- README.txt
, например.)
В большинстве случаев этот вывод, вероятно, не очень интересен - в основном это будут изменения, которые были внесены в одного из родителей, но не во втором. Тем не менее, также стоит проверить вывод git show d8fa
- это будет показывать патч как часть его вывода, если были внесены изменения, внесенные слиянием, которые, кажется, не принадлежат ни одному из родителей, иногда известный как Слияние зла .