Як порівняти файли з двох різних галузей?


1537

У мене є сценарій, який добре працює в одній гілці, а в іншій ламається. Я хочу подивитися дві версії поруч і побачити, що відрізняється. Чи є способи зробити це?

Щоб було зрозуміло, я не шукаю інструмент порівняння (я використовую програму "Більше порівняння"). Я шукаю команду git diff, яка дозволить мені порівняти головну версію з моєю поточною версією гілки, щоб побачити, що змінилося. Я не посеред злиття чи нічого. Я просто хочу сказати щось на кшталт

git diff mybranch/myfile.cs master/myfile.cs

Відповіді:


2208

git diff може показати вам різницю між двома елементами:

git diff mybranch master -- myfile.cs

Або, рівнозначно:

git diff mybranch..master -- myfile.cs

Використовуючи останній синтаксис, якщо будь-яка сторона HEADйого може бути опущена (наприклад, master..порівняння masterз HEAD).

Вас також можуть зацікавити mybranch...mastergit diffдокументів ):

Ця форма призначена для перегляду змін на гілці, що містить і до другої <commit>, починаючи від спільного предка обох <commit>. git diff A...Bеквівалентно git diff $(git-merge-base A B) B.

Іншими словами, це призведе до різних змін, masterоскільки вони відхилилися від mybranch(але без нових змін з того часу mybranch).


У всіх випадках --роздільник перед назвою файлу вказує кінець прапорів командного рядка. Це необов’язково, якщо Git не заплутається, якщо аргумент посилається на фіксацію чи файл, але включаючи це не погана звичка потрапляти. Дивіться https://stackoverflow.com/a/13321491/54249 для кількох прикладів.


Ті ж аргументи можна передавати, git difftoolякщо у вас налаштований один.


44
І якщо жодна з двох версій, яку ви хочете порівняти, не є робочим деревом, ви можете використовувати git diff branch1 branch2 myfile.cs. (Це більше --не повинно бути необхідним, оскільки це може зайняти до двох аргументів перегляду.)
Cascabel

8
Я перепробував кожну версію цього, і нічого не відбувається. У мене налаштований difftool (він працює для об'єднання). У мене є файл під назвою bd.ps1. Кожна версія команди, яку я набираю, нічого не робить. Це навіть не дає помилки. WTH!?!?!
Міхей

3
@Micah: Ви також пробуєте це з простим розбігом? Ви правильно набрали шлях відносно поточного каталогу? (Він мовчки не покаже різниці, якщо файл не існує, і ви використовуєте --. Поширена і проста помилка.)
Cascabel

5
Це не спрацювало для мене, якщо я не включив повний шлях до файлу, як показано git diff --name-status branch1..branch2(мабуть, очевидно, але я подумав, що я згадаю його у випадку, якщо хтось інший має таку ж проблему, що і я).
hBrent

4
Порядок моєї галузі та господаря також важливий. Файл у першій гілці буде показано з префіксами '-', файл у другій гілці буде показано з префіксами '+'.
тембо

413

Ви можете зробити це: git diff branch1:path/to/file branch2:path/to/file

Якщо у вас налаштовано difftool, ви також можете: git difftool branch1:path/to/file branch2:path/to/file

Пов'язане запитання: Як я бачу git diff з програмою Visual Diff


4
Використання колонок насправді не чудовий спосіб - це означає, що ви посилаєтеся на файли через дерева-об’єкти, тому вам доведеться вводити повний шлях, а не відносно поточного каталогу.
Каскабель

13
@Jefromi, це, можливо, змінилося в більш новій версії, але принаймні зараз ви можете використовувати відносні шляхи (наприклад branch1:./file). Це також корисно, якщо файл знаходиться в окремому місці між гілками (наприклад, git diff branch1:old/path/to/file branch2:new/path/to/file).
redbmk

4
@redbmk Так, це було десь між 2010 і зараз! Але якщо це один і той же файл на обох гілках, не потрібно робити це так, просто git diff branch1 branch2 path/to/file.
Каскабель

3
@jefromi круто, я не був впевнений в часовій шкалі, коли це було додано. Так, я б звичайно використовував згаданий вами синтаксис, але відповідь Тіма допомогла мені зрозуміти, як порівнювати файли з різними шляхами, хоча це не справді те, що запитували
redbmk

1
Хоча я люблю цю ідею, я не можу змусити цей синтаксис працювати або знайти будь-яку згадку про нього в документах git diff. Що я пропускаю? Дякую!
yoyo

160

Більш сучасний синтаксис:

git diff ..master path/to/file

Префікс з двома крапками означає "з поточного робочого каталогу в". Ви також можете сказати:

  • master.., тобто реверс вище. Це те саме, що master.
  • mybranch..master, явно посилаючись на стан, відмінний від поточного робочого дерева.
  • v2.0.1..master, тобто посилання на тег.
  • [refspec]..[refspec]в основному все, що можна ідентифікувати як стан коду для git.

33

Існує багато способів порівняння файлів з двох різних гілок:

  • Варіант 1: Якщо ви хочете порівняти файл з n конкретної гілки до іншої конкретної гілки:

    git diff branch1name branch2name path/to/file
    

    Приклад:

    git diff mybranch/myfile.cs mysecondbranch/myfile.cs
    

    У цьому прикладі ви порівнюєте файл у гілці “mybranch” з файлом у гілці “mysecondbranch”.

  • Варіант 2: Простий спосіб:

     git diff branch1:file branch2:file
    

    Приклад:

     git diff mybranch:myfile.cs mysecondbranch:myfile.cs
    

    Цей приклад схожий на варіант 1.

  • Варіант 3: Якщо ви хочете порівняти поточний робочий каталог з деякою галуззю:

    git diff ..someBranch path/to/file
    

    Приклад:

    git diff ..master myfile.cs
    

    У цьому прикладі ви порівнюєте файл з вашої фактичної гілки з файлом у головній гілці.


12

Я просто роблю git diff branch1 branch2 path/to/file

Це перевіряє відмінності між файлами. Зміни branch1в червоному кольорі. Зміни branch2в зеленому кольорі.

Передбачається, що branch1це минуле і branch2це майбутнє. Ви можете змінити це, змінивши порядок гілок у відмінність:git diff branch2 branch1


Яка версія git diff може це зробити? Схоже, він не підтримується у запущеній версії (2..9.2.Windows.1).
Вінс Боудрен

9

Якщо ви хочете зробити відмінності від поточної гілки, можете опустити її та скористатися:

git diff $BRANCH -- path/to/file

таким чином вона буде відрізнятися від поточної гілки до посилальної гілки ( $BRANCH).


5

Погоджуючись з відповіддю, запропонованою @dahlbyk. Якщо ви хочете, щоб diff було записано у файл diff для перегляду коду, скористайтеся наступною командою.

git diff branch master -- filepath/filename.extension > filename.diff --cached

2

У моєму випадку я використовую команду нижче:

git diff <branch name> -- <path + file name>

Ця команда може допомогти вам порівняти один і той же файл у двох різних гілках


1

Найкраще це зробити, використовуючи git diffнаступний спосіб: git diff <source_branch> <target_branch> -- file_path

Він перевірить різницю між файлами в цих гілках. Перегляньте цю статтю для отримання додаткової інформації про команди git та їх роботу.


1

Використовуйте хеші фіксації так:

git diff <hash1> <hash2> <filename>

де hash1 може бути будь- яким комітом з будь-якої гілки, те ж саме для hash2 .


1

Для порівняння файлів є два сценарії:

Сценарій 1: Порівняйте файли у віддалених відділеннях (обидві гілки повинні існувати у віддаленому сховищі)

Сценарій 2: Порівняйте локальні файли (у місцевій копії робочої області) з файлами у віддаленому сховищі.

Логіка проста. Якщо ви надаєте два імені гілок для розрізнення, воно завжди буде порівнювати віддалені гілки, а якщо ви надаєте лише одне ім’я гілки, воно завжди порівнюватиме вашу локальну робочу копію з віддаленим репо (тим, що ви надали). Ви можете використовувати діапазон для надання віддалених сховищ.

наприклад Оформити відділення

git checkout branch1
git diff branch2 [filename]

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

git diff branch1 branch2 [filename]

у цьому випадку воно порівнятиме ім’я файлу з віддалених гілок з назвою " branch1 " та " branch2 "

git diff ..branch2 [filename]

і в цьому випадку воно порівнятиме ім'я файлу з віддалених гілок з назвою " branch1 " vs " branch2 ". Отже, його те саме, що вище. Однак якщо ви тільки що створили гілку з іншої гілки, скажіть "master", і ваша поточна гілка не існує у віддаленому сховищі, вона порівняє віддалений " master " з віддаленим " branch2 ".

Сподіваюся, що це корисно.


0

Для порівняння двох файлів у git bash вам потрібно скористатися командою:

git diff <Branch name>..master -- Filename.extension   

Ця команда покаже різницю між двома файлами в самому баші.

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