2015-01-13 4 views
1

Есть ли простой способ получить разницу между несколькими (более чем двумя) ветвями с git? (Что-то вроде «octopus diff»?)Многоотраслевой diff с git?

Ситуация такова, что есть ветка (назовем ее ветвью А), которая является результатом слияния нескольких других ветвей (назовем их B и C) вместе с другими изменениями , (Филиал A, отклоненный от ветви B, имел ряд локальных модификаций, затем была объединена ветвь C, затем добавлены локальные модификации, затем еще более локальные модификации и повторное объединение, чтобы включать обновления в ветвях B и C.)

что я хотел бы сделать, это увидеть все локальные изменения уникальные расшириться А - то есть, посмотреть, какие изменения были сделаны расшириться А, не на любой ветви B или C. филиал

ответ

1

Отделать ветку «bPlusC» от ​​B, а затем слить «C». Положите это на «A».

git checkout -b bPlusC B 
git merge --no-ff C 
git checkout A 
git diff bPlusC..HEAD 

EDIT: Основываясь на комментарий Р. М.:

Если B или C имеют коммиты, которые не в использовании этого:

git checkout -b bPlusC $(git merge-base A B) 
git merge --no-ff $(git merge-base A C) 
git checkout A 
git diff bPlusC..HEAD 
+0

Это работает только если B и C являются полностью объединены в A. Если эти ветви еще не объединены в A, они будут отображаться как обратное изменение diff. Чтобы исправить это, я думаю, что git merge-base должна помочь: 'git checkout -b bPlusC B $ (git merge-base AB)' и 'git merge -no-ff $ (git merge-base AC)' (Хотя вам действительно нужен -no-ff?) –

+0

@RM Я изменил ответ. '--no-ff' не является строго необходимым, но он оставляет больше видимого следа. Поскольку вы не будете толкать эту ветку (я надеюсь), я не очень беспокоюсь о том, чтобы сделать «уродливое» слияние. –

+0

Незначительное добавление/коррекция: в зависимости от того, насколько сложным является ваш шаблон слияния, может быть * несколько * объединенных баз, но по умолчанию выводится только одно. Флаг «-all» получит их все, но протокол немного изменится. «Git merge-base - all A B C» должен (?) Найти SHA1 соответствующих коммитов (ветвь A должна быть первой, а затем две или более отрицательных ветвей). Если только один, поздравляю, просто используйте это как ссылку на diff. Если несколько, то используйте стратегию new-branch + merge с перечисленными SHA1, в отличие от коммитов B & C или подстановки команд. –

0

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

Одна из возможностей - использовать опцию -p (patch) git log, который может занять несколько меток ветвления как для включения и исключения:

git log -p branch_A ^branch_B ^branch_C 

Это не дает ни одного сводки изменений, как мерзавец дифф бы, однако, вместо того, чтобы давать отдельные изменения для каждого коммита включен в ветви А но не в ветвях B или C.

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