Git відрізняється між поточною гілкою та master, але не включає неперекладені майстер-комітети


171

Я хочу, щоб у всіх галузях, які ще не об'єднані для освоєння, є різні зміни.

Я намагався:

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

Однак у кожному з цих випадків diff містить вміст у програмі master, який ще не був об'єднаний у мою гілку.

Чи є спосіб зробити різницю між моєю гілкою та майстром, яка виключає зміни в master, які ще не були об'єднані в мою гілку?


9
Якщо перевернути навколо другий варіант, ви отримаєте те , що ви хочете: git diff master..branch. Ви можете скоротити його, git diff master..якщо ви на гілці. r1..r2Синтаксис є абревіатурою , ^r1 r2що означає «показати мені все , що відбувається від r2і не досяжна з r1». git help gitrevisionsмістить інформацію про різні синтаксиси, які ви можете використовувати.
Джон Сакмайстер

1
Я розширив свою відповідь після того, як прочитав більше про ...синтаксис git diff. Ваш коментар неправильний, @jszakmeister, оскільки діапазони редагувань, як описано в gitrevisions, не мають нічого спільного git diff. Diff порівнює два моменти в історії, не може працювати з діапазоном.
Палець

Ви праві. Я завжди забуваю, що git diffпрацює інакше, ніж інші команди ... факт, який мені здається неприємним. :-(
Іоан Сакмайстер

переконайтеся, що ви поновлюєте локальну копію майстра перед порівнянням
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].


Для мене $ 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працювали б ще до каси.
Палець

44

Ось що для мене спрацювало:

git diff origin/master...

Це показує лише зміни між моєю вибраною локальною гілкою та віддаленою головною гілкою, а також ігнорує всі зміни в моїй локальній гілці, що надійшли з комірок об'єднання.


Для довідки, якщо вам потрібні посилання на комітети, які містять ці зміни, використовуйте git cherry origin/master.
jaytibann

Якщо це показує купу сміття, якого ви не очікували, masterможливо, ви переобладнали набір комірок з-під вас.
Майкл - Де Клей

21

Як також зазначають Джон Сакмайстер та Василь Новиков, найкоротша команда отримати повний розбіжність з точки зору майстра на вашій гілці:

git diff master...

Для цього використовується ваша локальна копія майстра.

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

git diff master... filepath

Приклад виводу:

Приклад використання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.