Git diff между текущей веткой и мастером, но не включает в себя необработанные коммиты

171

Я хочу увидеть разницу всех изменений в ветке, которая еще не объединена с мастером.

Я попытался:

git diff master
git diff branch..master
git diff branch...master

Однако в каждом из этих случаев diff содержит содержимое в master, которое еще не было объединено с моей веткой.

Есть ли способ провести различие между моей веткой и мастером, которое исключает изменения в мастере, которые еще не были объединены в мою ветку?

pillarOfLight
источник
9
Если перевернуть вокруг второй вариант, вы получите то , что вы хотите: git diff master..branch. Вы можете сократить его, git diff master..если вы находитесь на ветке. r1..r2Синтаксис является аббревиатурой , ^r1 r2что означает «показать мне все , что происходит от r2и не достижима из r1». git help gitrevisionsсодержит информацию о различных синтаксисах, которые вы можете использовать.
Джон Szakmeister
1
Я расширил свой ответ после того, как прочитал больше о ...синтаксисе git diff. Ваш комментарий неверен, @jszakmeister, потому что диапазоны ревизий, описанные в gitrevisions, не имеют ничего общего с git diff. Дифф сравнивает две точки в истории, не может работать с диапазоном.
Palec
Ты прав. Я всегда забываю, что это git diffработает не так, как другие команды ... факт, который меня расстраивает. :-(
Джон Шакмейстер,
перед сравнением убедитесь, что вы обновили локальную копию master
joe

Ответы:

232
git diff `git merge-base master branch`..branch

База слияния - это точка, от которой branchотходят master.

Git diff поддерживает специальный синтаксис для этого:

git diff master...branch

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

Слабо связанные:


Обратите внимание, что ..и ...синтаксис не имеет той же семантики, что и в других инструментах Git. Это отличается от значения, указанного в man gitrevisions.

Цитирование man git-diff:

  • git diff [--options] <commit> <commit> [--] [<path>…]

    Это для просмотра изменений между двумя произвольными <commit>.

  • git diff [--options] <commit>..<commit> [--] [<path>…]

    Это синоним предыдущей формы. Если <commit>на одной стороне не указано, это будет иметь тот же эффект, что и использование HEADвместо.

  • git diff [--options] <commit>...<commit> [--] [<path>…]

    Эта форма предназначена для просмотра изменений на ветви, содержащей и вплоть до второй <commit>, начиная с общего предка обоих <commit>. « git diff A...Bэквивалентно git diff $(git-merge-base A B) B». Вы можете опустить любой из них <commit>, который имеет тот же эффект, что и HEADвместо этого.

На всякий случай, если вы делаете что-то экзотическое, следует отметить, что все приведенное <commit>выше описание, за исключением двух последних форм, использующих обозначения «..», может быть любым <tree>.

Для получения более полного списка способов написания <commit>, см. Раздел «УКАЗАНИЕ ПЕРЕСМОТРОВ» в gitrevisions[7]. Однако «diff» означает сравнение двух конечных точек, а не диапазонов, а обозначения диапазонов (« <commit>..<commit>» и « <commit>...<commit>») не означают диапазон, определенный в разделе «УКАЗАНИЕ ДИАПАЗОНОВ» в gitrevisions[7].

Palec
источник
Для меня $ git diff master...branchпроизведено fatal: ambiguous argument 'master...branch': unknown revision or path not in the working tree.- это зависимая от версии команда?
Джоэл Пелтонен,
На самом деле, я только что понял, что «ветка» должна быть названием вашей ветви, я думал, что это ссылка на текущую ветку
Джоэл Пелтонен,
4
Вы правы, мой ответ опирается на вызываемую ветку branch. Я решил придерживаться имени, которое ОП выбрал в вопросе. Если вы хотите использовать текущую ветку, замените branchна HEAD.
Палек
14
Обратите внимание, что вы можете использовать, git diff master...чтобы избежать указания ветви (текущая будет принята).
Василий Новиков
1
develРаботает ли оригинальная команда после проверки , @ChrisGuest? Возможно, Git создал для вас ветку во время оформления заказа, как локальную копию удаленной ветки (как правило origin/devel). Если бы это было так, git diff origin/devel...bugfix/API-353-api-allows-database-access-whenсработало бы еще до оформления заказа.
Palec
45

Вот что сработало для меня:

git diff origin/master...

Это показывает только изменения между моей текущей выбранной локальной веткой и удаленной главной веткой, и игнорирует все изменения в моей локальной ветке, которые произошли от коммитов слияния.

возлюбленный Израиль
источник
Для справки, если вам нужны коммиты коммитов, которые содержат эти изменения, используйте git cherry origin/master.
Джайтибанн
Если это показывает кучу мусора, которого вы не ожидали, masterвозможно, вы отклонили набор коммитов из-под вас.
Майкл - Где Клэй Ширки
21

Как также отметили Джон Шакмейстер и Василий Новиков, самая короткая команда для получения полного различий с точки зрения мастера в вашей ветке:

git diff master...

Это использует вашу локальную копию мастера.

Для сравнения конкретного файла используйте:

git diff master... filepath

Пример вывода:

Пример использования

Эндрю Шрайбер
источник