Показано, які файли змінилися між двома версіями


2105

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

Перейшов за цим посиланням: http://linux.yyz.us/git-howto.html, що було дуже корисно.

Інструменти для порівняння галузей, на які я натрапив:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

Мені було цікаво, чи є щось на кшталт "git status master..branch", щоб бачити лише ті файли, які відрізняються між двома гілками.

Не створюючи нового інструменту, я думаю, що це найближче, що ви можете зробити це зараз (що, звичайно, буде показувати повтори, якщо файл було змінено більше одного разу):

  • git diff master..branch | grep "^diff"

Цікаво, чи щось я пропустив ...


12
Скільки інших вважають заголовок цього питання оманливим? Йдеться фактично про пошук різниць у файлі між двома гілками. Я прийшов сюди шукати, як побачити різниці файлів між двома редакціями на одній гілці. Або я єдиний?
Сандепіан Нат

4
@SandeepanNath: з git різниці немає. Ви завжди посилаєтесь на окремі комітети.
Samuel O'Malley

@ SamuelO'Malley Я новачок в геті і розглядаю, здавалося б, загальну стратегію розгалуження, в якій всі гілки нарешті об'єднуються в головну гілку, і в кінцевому рахунку майстер розгортається. Тепер, розглядаючи подію розгортання, де виробництво вже перебуває у головному, але позаду кінця (однією редакцією, якщо останній випуск відбувся після злиття останнього майстра), я хотів би побачити відмінності між цими двома редакціями, щоб дізнайся, що було б розгорнуто. Я не хотів би дивитися на гілку, яка востаннє злилася. Виправте мене, якщо я помиляюся.
Сандепіан Нат

2
@SandeepanNath: замість використання імен гілок ви можете взяти відповіді нижче та просто вказати ідентифікатори комісій. Або навіть посилайтеся на комітети за їхніми іменами тегів, якщо ви створюєте теги під час розгортання.
Samuel O'Malley

1
@SandeepanNath Ви не можете порівняти 2 гілки, ви повинні вказати версію. Отже, порівнюючи 2 гілки, порівнюємо 2 зміни.
Bastien Vandamme

Відповіді:


2574

Для порівняння поточної гілки з masterгілкою:

$ git diff --name-status master

Для порівняння будь-яких двох галузей:

$ git diff --name-status firstbranch..yourBranchName

Прочитайте далі git diffв офіційній документації .


2
Що означають кожний з індексів ліворуч (я бачу багато M і D)?
gogogadgetinternet

15
@ user446936 - ви можете побачити, що означають літери на сторінці git status man @ kernel.org/pub/software/scm/git/docs/git-status.html - зокрема, M == змінено, D == видалено
Джеймс Меннінг

12
git diff --name-status your_branch...masterвиводить зміни, які відбулися на master з моменту створення з нього your_branch
Radu

1
Оператор з двома крапками тут зайвий, тому що відмінності є попарно.
jub0bs

2
Я отримую невідому редакцію чи шлях не в робочому дереві.
SuperUberDuper

408

Спробуйте

$ git diff --stat --color master..branchName

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

Ви також можете перевернути гілки, щоб отримати ще більш чітке уявлення про різницю, якщо ви злилися іншим способом:

$ git diff --stat --color branchName..master

77
Якщо у вас (настійно рекомендується, імхо) колір git увімкнено ( config --global color.ui true), ви можете пропустити --color. (У мене є lks - синдром ледачої клавіатури.)
Art Swri

25
Я з тобою на кольорі! До речі, я мав намір сказати git config --global color.ui true- бути повною.
Art Swri

2
Не працює, кидає помилки:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
Томаш Зато - Відновіть Моніку

7
@ TomášZato вибачте, але вам потрібно поміняти "branchName" на ім'я своєї філії.
Геррі

161

Також пам’ятайте, що git має дешеве і просте розгалуження. Якщо я думаю, що злиття може бути проблематичним, я створюю гілку для злиття. Отже, якщо masterє зміни, в які я хочу об'єднатись, і baмоя гілка потребує коду від головного, я можу зробити наступне:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

Кінцевим результатом є те, що я повинен спробувати злиття на викинутій гілці, перш ніж прикручувати свою гілку. Якщо я заплутався, я можу просто видалити ba-mergeгілку і почати спочатку .


4
Дивовижно. Я ніколи не думав розгалужуватися таким чином. Я думаю, що це слід розглядати як частину "найкращих практик" при об'єднанні.
egelev

Коли ви об'єднуєте ба-мардж назад у ба, чи не існує можливості знову залагодити конфлікти?
Йозеф.B

2
@EricAnderson Правильно, це графік. SVN прилипає, як гумка під шкільну парту. Дякую.
Йозеф.Б

1
Чому вам потрібно зробити останній крок "git merge master", якщо у ba-merge вже був master
qwebek

Ви можете залишити це. Єдиною причиною, що було б корисно, є те, якщо нові речі висаджуються під masterчас роботи над переглядом коду та виправленням конфліктів.
Ерік Андерсон

58

Якщо хтось намагається генерувати файл diff з двох гілок:

git diff master..otherbranch > myDiffFile.diff

2
Це стане в нагоді особливо з великими гілками, що містять багато відмінностей.
vandsh

Це корисно, коли різниця дійсно велика. За замовчуванням він не показав би всі розбіжності в консолі (мені було цікаво чому), передача diff у файл - це шлях, який потрібно пройти в такому випадку.
rotimi-best

42

Існує також метод на основі GUI.

Можна використовувати gitk .

  1. Виконати:

    $ gitk --all
    
  2. Клацніть правою кнопкою миші на філії філії та виберіть Позначити цю комісію у спливаючому меню.

  3. Клацніть правою клавішею миші на іншій гілці та виберіть Diff this -> позначена фіксація або Diff отбелязана фіксація -> this .

Тоді на правій нижній панелі з’явиться список змінених файлів, а деталі - на нижній лівій панелі.


3
@Orwellophile Я завантажую відео, щоб показати, як це зробити. Сподіваюся, це допоможе тобі.
Янтао Ся

Нічого собі, я відчуваю себе особливим. Я додав закладки на смачний сайт.com для подальшої довідки та додаткової google-foo.
Орвелофіл

Відповідь сильно занижена. Дякую!
Кошине

36

Ще один варіант, використовуючи в цьому випадку meld:

git difftool -d master otherbranch

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


6
Може хотіти встановити meld як типовий difftool: git config --global diff.tool meld
bwv549

1
Це мій улюблений, тому що він буде використовувати будь-який дифтоул, який ви налаштовуєте.
Йосія

Не підтримується в OSX. :-(
Майк С.

@MikeS. перевірте цю відповідь stackoverflow.com/a/12815806/151918, вона містить інструкції для OSX. Мені це принаймні працює, сподіваюся, що це допомагає.
rsilva4

Приємно. Але для чого -dваріант?
Scotty.NET

29

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


10
Девід, це хороший момент, хоча було б непогано просто знати, що відбувається перед
вами

18

І якщо ви шукаєте зміни лише серед певних файлів, тоді:

git diff branch1 branch2 -- myfile1.js myfile2.js

branch1 є необов’язковим, і ваша поточна гілка (гілка, на якій ви перебуваєте) вважатиметься за замовчуванням, якщо галузь1 не надана. наприклад:

git diff master -- controller/index.js

15

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

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

git fetch
git diff origin/master...

Просто використання git diff master може включати або не включати відповідні зміни.



8

Можна сказати дві гілки

  • A (Відділення, над яким ви працюєте)
  • B (Ще одна галузь, з якою ви хочете порівняти)

Перебуваючи у відділенні А, ви можете набрати

git diff --color B

тоді це дасть вам вихід

введіть тут опис зображення

Важливим моментом у цьому є

  1. Текст зеленого кольору присутній у відділенні А

  2. Текст червоним кольором присутній у відділенні B


8

Тут є багато відповідей, але я хотів додати щось, що зазвичай використовую. ЯКЩО ви перебуваєте в одній із галузей, яку ви хотіли б порівняти, я зазвичай виконую одну з наступних дій. Заради цієї відповіді ми скажемо, що ми перебуваємо в нашій вторинній галузі. Залежно від того, який погляд вам потрібен на той час, буде залежати, який ви обираєте, але більшу частину часу я використовую другий варіант із двох. Перший варіант може бути корисним, якщо ви намагаєтеся повернутись до оригінальної копії - в будь-якому випадку, і обидва виконаєте роботу!

Це порівняє головну гілку з тією галуззю, в якій ми перебуваємо (яка є вторинною), а оригінальним кодом будуть додані рядки, а новий код вважатиметься видаленими рядками

git diff ..master

АБО

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

git diff master..

1

Якщо ви використовуєте Github / Github Enterprise, ви можете використовувати веб-інтерфейс, натиснувши URL-адресу /compareшляху вашого сховища, наприклад, https://github.com/http4s/http4s/compare . Ви можете вибрати гілку / комісію / тег, яку потрібно порівняти: Github Порівняти знімок екрана

І різниця буде представлена ​​в інтерфейсі github за URL-адресою, /compare/{x1}...{x2}де є x2і x1є гілка / комірка / тег, яку ви хочете порівняти, наприклад: https://github.com/http4s/http4s/compare/release-0.18.x ... майстер

Більше ви можете побачити в документі Github .


0

Для людей, які шукають рішення для графічного інтерфейсу, Git Cola має дуже приємний "Переглядач відрізків відділень ( Diff -> Відділення .. ).


-1
git diff revision_n revision_m

якщо revision_nі revision_mє послідовними дорученнями, то він виводить так само, як git show revision_m


-1

Ви також можете використовувати візуальний розл .

Наприклад, якщо ви використовуєте Sourcetree , ви можете просто вибрати будь-які два коміти в режимі перегляду журналу .

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


-2

Якщо вам подобається графічний інтерфейс і ви використовуєте Windows, ось простий спосіб.

  1. Завантажте WinMerge
  2. Перегляньте дві гілки в різні папки
  3. Зробіть папку за папкою порівнянням за допомогою WinMerge. Ви також можете легко вносити зміни, якщо одна з гілок є тією, над якою ви працюєте.

Це не найпростіший спосіб, насправді не потрібно завантажувати репости для відмінностей між гілками.
stefgosselin

Це дійсно не найпростіший спосіб, але це спосіб GUI, який часто набагато простіше, особливо для перегляду різниць у всіх файлах
Marius Matioc

-3

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

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

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


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