Git diff по теме ветки, исключая коммиты слияния, которые произошли за это время? - PullRequest
12 голосов
/ 20 сентября 2011

Допустим, у меня следующая ситуация:

    B---D---F---G topic
   /       /
--A---C---E master

В целях проверки кода я хотел бы извлечь diff из коммита A для коммита G, но не включая коммиты E и C, которые произошли наосновная ветвь, а также не включая коммит F, который является коммитом слияния.

Другими словами, я хотел бы создать diff, содержащий изменения от F до G, и объединить эти изменения с изменениями от A до D.

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

Этовозможный?Если git не может обрабатывать такие «агрегации различий», я был бы очень благодарен, если бы кто-то мог предоставить некоторые указатели относительно того, как какая-то внешняя команда может сделать это (так что я могу попробовать написать сценарий bash, который бы справился).

Ответы [ 3 ]

5 голосов
/ 20 сентября 2011

Если вам все равно, что находится в части контекста различий, то git diff master..topic даст вам то, что вы хотите.Любые изменения, введенные в C и E, считаются частью "базы" различий, поэтому изменения из master будут присутствовать в контексте, но будут отмечены только фактические изменения, внесенные в ветку вашей темы.с + или - в качестве изменений.Обычно это то, что люди хотят для обзоров кода.

Если вместо этого вы хотите действовать так, как будто слияние никогда не происходило, вам придется отменить его:

git rebase --onto A master
3 голосов
/ 19 февраля 2015

Ответ Карла вводит в заблуждение:

git diff никогда не работает на подходящих диапазонах (то есть, несколько коммитов), только между двумя коммитами!

Синтаксис диапазона имеет особое значение для git diff.

git diff E..G всегда равно git diff E G
git diff E...G равно git diff E G в этом случае, потому что E - это основа слияния между ними). ​​

git diff master...topic - это то, что вы хотите в этом и в общем случае : он показывает вам все изменения ветки темы, сравнивая ее с последней базой слияния (т.е. противопоставляя ее мастеру, когда он был объединен в последний раз, игнорируя все последующие изменения в master, которые в любом случае отсутствуют в вашей ветке).

Примечание: к сожалению (по стечению обстоятельств?) Эффект x..y в git log и т. Д. Лучше всего представлен x...y в git diff и наоборот!

1 голос
/ 20 сентября 2011

А как насчет:

  1. тема оформления git

  2. проверка git -b temp

  3. git revert F

  4. git diff A

После этого вы можете счастливо удалить временную ветвь.

...