Як побачити зміни в Git-комітеті?


1545

Коли я це git diff COMMITбачу, я бачу зміни між цим комітом і HEAD (наскільки я знаю), але я хотів би побачити зміни, які були внесені цим єдиним зобов'язанням.

Я не знайшов очевидних варіантів на diff/, logякі дадуть мені такий вихід.


Відповіді:


1970

Щоб побачити різницю для конкретного COMMITхеша:

git diff COMMIT~ COMMITпокаже вам різницю між цим COMMITпредком і тим COMMIT. Докладні відомості про команду та gitrevision про нотацію та її друзів див. На сторінках man для git diff . ~

Як варіант, git show COMMITзробимо щось дуже схоже. (Дані комітету, включаючи його різні - але не для об'єднань.) Див. Сторінку git show .


17
Зауважте, що ^потреби цитуються в оболонках Томсона та Борна (синонім до них |) та rcїх похідних (оператор zshnot
карети

3
Зауважте, що HEAD^мається на увазі перший батько у випадку, якщо у комітки є декілька батьків (тобто об'єднання об'єднань).
Мансур

23
git diff COMMIT~ COMMITпрацює на мене, помічайте тильду замість карети. Я запускаю git версії 2.6.1.Windows.1 в Windows 10.
Juuso Ohtonen

14
@tradetree: слово COMMIT повинно бути замінене назвою деяких комітів, наприклад, суми SHA.
Нік Маттео

91
Я вважаю, що git show є більш підходящим для цього питання, і це має бути пропозицією, згаданою першою.
pypmannetjies

496

Як згадується у " Скороченій записі на відміну від git commit зі своїм батьком? ", Ви також можете використовувати git diffз:

git diff COMMIT^!

або

git diff-tree -p COMMIT

З git show вам знадобиться (щоб зосередитись на розрізненні один):

git show --color --pretty=format:%b $COMMIT

COMMITПараметр є МІГ-фіксації :

Фіксації об'єкта або об'єкт , який може бути рекурсивно разименовивается до фіксації об'єкта. Нижче перелічені всі фіксації: об’єкт фіксації, об’єкт тегів, який вказує на об’єкт фіксації, об’єкт тегу, який вказує на об’єкт тегу, який вказує на об'єкт фіксації тощо.

Див. Gitrevision "СПЕЦІФІКАЦІЙНІ ПОЗИЦІЇ" для посилання на комісію .
Дивіться також " Що означає дерево-ish в Git? ".


369

Ви також можете спробувати цей простий спосіб:

git show <COMMIT>

2
Здається, це робить щось зовсім інше
жалюгідна змінна

3
Він показує лише повідомлення про фіксацію. Не різниця змін коду, застосованих для цього коміту.
k0pernikus

1
Так? Нарешті в останніх версіях git ...
Деві

2
Це має бути оновлена ​​правильна відповідь
Скотт Скілз,

1
Це має бути відповіддю.
Roel

77

git show показує зміни, внесені в останній комітет.

Еквівалентно git show HEAD.

git show HEAD~1 повертає вас назад 1 вчинення.


45

Я зазвичай роблю:

git diff HEAD~1

Показати зміни стосовно останнього зобов’язання. Якщо у вас є більше комісій, просто збільште число 1 до кількості комітів, які ви хочете побачити.


34

Спочатку отримайте ідентифікатор комісії за допомогою,

git log #to list all

Або

git log -p -1 #last one commit id

Скопіювати ідентифікатор фіксації

Тепер ми використовуємо два способи для перерахування змін певного комітету,

Спосіб 1:

git diff commit_id^! #commit id something like this 1c6a6000asad012

Спосіб 2:

git show commit_id
For example: git show 1c6a600a

2
Що ^!означає ??
Мартін Колл

2
^! - це стенограма для фіксації ^ .. скористатися, що означає, що буде виключено всіх батьків і перевірити
різницю

Я не експерт, але у мене є випадок (із залученням декількох гілок), коли git log c ^! не точно такий, як git log c ^ .. c. Насправді це набагато краще: git log c ^ .. c вказав занадто багато записів, тоді як git log c ^! зробив правильно, тож це те, що я довго
шукав

32
git show <commit_sha>

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

git show <beginning_sha> <ending_sha>

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


25

На головній сторінці для git-diff (1) :

git diff [options] [<commit>] [--] [<path>…]
git diff [options] --cached [<commit>] [--] [<path>…]
git diff [options] <commit> <commit> [--] [<path>…]
git diff [options] <blob> <blob>
git diff [options] [--no-index] [--] <path> <path>

Використовуйте третій посередині:

git diff [options] <parent-commit> <commit>

Також із тієї ж основної сторінки, внизу, у розділі Приклади :

$ git diff HEAD^ HEAD      <3>

Порівняйте версію до останнього фіксації та останнього виконання.

Справді, це написано трохи заплутано, було б менш заплутано як

Порівняйте найновіший комітет із зобов’язанням перед ним.


3
Ваше переформулювання стосується і цього git diff HEAD HEAD^.
Річард

git diff HEAD ^ HEAD не відображає жодних змін.
користувач3690202

@ user3690202, що означає, що зміни не відображаються. Це насправді так?

Як не може бути змін для відображення? Якщо ви хочете переглянути останнє зобов’язання, напевно, якщо ви не будете абсолютно новим сховищем, будуть відображені деякі зміни?
користувач3690202

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

22

Наступне, здається, виконує роботу; Я використовую це, щоб показати, що було введено об'єднанням.

git whatchanged -m -n 1 -p <SHA-1 hash of merge commit>

Це теж би спрацювало git log? (З - за stackoverflow.com/a/18585297/6309 )
VonC

16

Інша можливість:

git log -p COMMIT -1

1
@GrantMcLean Так, і це вже є найвищим відгуком відповіді, тому я не згадую про це.
John_West

11

Ви можете використовувати git diff HEAD HEAD^1 щоб побачити різницю з батьківським комітом.

Якщо ви хочете бачити лише список файлів, додайте --statопцію.


Це те, що ти маєш на увазі, git diff HEAD ^ 1 HEAD
Shibir Basak

Зауважте, що це покаже те, що ви додали як видалене, оскільки це буде робити зворотне порівняння. Як ви повинні прочитати diffкоманду, це: що мені потрібно змінити у файлі, щоб взяти з себе HEADзобов’язання виконувати HEAD^1?
brainplot

9
git difftool COMMIT^ <commit hash>

Можливо також, якщо ви налаштували дифтоул.

Дивіться тут, як налаштувати difftool або сторінку керівництва тут

Крім того, ви можете використовувати, git diff-tree --no-commit-id --name-only -r <commit hash>щоб побачити, які файли були змінені / скоєні в хеші для віддачі


9

Мені подобається нижченаведена команда для порівняння конкретного комітету та його останнього виконання:

git diff <commit-hash>^-

Приклад:

git diff cd1b3f485^-

6

Щоб побачити автора та час за допомогою використання комісій git show COMMIT. У результаті чого вийде щось подібне:

commit 13414df70354678b1b9304ebe4b6d204810f867e
Merge: a2a2894 3a1ba8f
Author: You <you@you.com>
Date:   Fri Jul 24 17:46:42 2015 -0700

     Merge remote-tracking branch 'origin/your-feature'

Якщо ви хочете побачити, які файли були змінені, виконайте наступне зі значеннями з рядка Злиття вище git diff --stat a2a2894 3a1ba8f .

Якщо ви хочете побачити фактичну різницю, запустіть git --stat a2a2894 3a1ba8f


"Якщо ви хочете побачити фактичну різницю, запустіть git --stat a2a2894 3a1ba8f". Я думаю, ти маєш на увазі git diff a2a2894 3a1ba8fабо інше unknown option: --stat.
Фрукти

5

Для перевірки повних змін:

  git diff <commit_Id_1> <commit_Id_2>

Для перевірки лише змінених / доданих / видалених файлів:

  git diff <commit_Id_1> <commit_Id_2> --name-only

ПРИМІТКА . Для перевірки відмінності між комісіями між ними, вам не потрібно ставити ідентифікатори комісій.


4

Я використовую Git версії 2.6.1.windows.1 в Windows 10, тому мені потрібна була незначна зміна відповіді Невіка (tilde замість карети):

git diff COMMIT~ COMMIT

Ще один варіант - цитувати каре:

git diff "COMMIT^" COMMIT

3

Ця команда отримає вам батьківський Git-хеш:

git log -n 2 <commit-hash>

Після того git diff-tool <commit-hash> <parent-commit-hash>

Приклад:

bonnie@bonnie ~/ $ git log -n 2 7f65b9a9d3820525766fcba285b3c678e889fe3

commit 7f65b9a9d3820525766fcba285b3c678e889fe3b
Author: souparno <souparno.majumder@gmail.com>
Date:   Mon Jul 25 13:17:07 2016 +0530

CSS changed to maintain the aspect ratio of the channel logos and to fit them properly.

commit c3a61f17e14e2b80cf64b172a45f1b4826ee291f
Author: souparno <souparno.majumder@gmail.com>
Date:   Mon Jul 25 11:28:09 2016 +0530

The ratio of the height to width of the channel images are maintained.

Після цього

git difftool 7f65b9a9d3820525766fcba285b3c678e889fe3b c3a61f17e14e2b80cf64b172a45f1b4826ee291f

2

Якщо ви просто хочете побачити зміни в останньому зобов'язанні, просто git showвам це дадуть.


1

У разі перевірки зміни джерела у графічному представленні,

$gitk (Mention your commit id here)

наприклад:

$gitk HEAD~1 

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