Покажите отличия от слияния для двух коммитов в git

У меня есть две коммиты, один из которых является предком другого. (Они, случается, являются начальными и конечными точками ветки. Я не думаю, что это имеет значение, но я включу его, если это произойдет).

Я хочу видеть разницу между двумя коммитами, но исключая изменения, сделанные во время коммитов (т.е. все коммиты с несколькими родителями), которые были сделаны между двумя коммитами. (В принципе, я хочу любое "реальное" совершение, которое было сделано в ветке, исключая слияния.)

Возможно ли это? Если да, то как вы это делаете?

При необходимости предположите, что конфликты не разрешены во время компиляции... но бонусные точки для решения, которое может обрабатывать их элегантно.

Ответ 1

Ваш вопрос немного неоднозначен, но я думаю, что вы этого хотите.

git log --no-merges -p branch-start..branch-end

Ответ 2

Я не знал опции -no-merges -o, но здесь другое решение (я полагаю, что слияния были сделаны от master):

git checkout -b temp
git rebase --onto master branch-start branch-end
git diff master

Ответ 3

Если ваши слияния все пришли из одной ветки (скажем master) или все они содержатся в другой ветке, вы можете использовать решение из этот вопрос.

Предполагая, что у вас есть дерево, как показано ниже:

         x---y-+-z-+-branch
        /     /   /
---a---b---c-+-d-+-e---master

и две коммиты, которые вы хотели бы сравнить: b и branch. Затем вместо сравнения двух коммитов, выполняющих

git diff master...branch

покажет все изменения, сделанные на ветке (x,y,z), исключая все, что также находится на master (c,d,e, слияния). Обратите внимание, что это также игнорирует любые изменения, сделанные в master, которые еще не находятся в ветке.

Из документов:

git diff [--options] commit... commit [-] [...]

Эта форма предназначена для просмотра изменений в ветке, содержащей и до второго фиксации, начиная с общего предка обоих совершает. "git diff A... B" эквивалентно "git diff $(git -merge-base A B) B".