Знаходження різниці між поточною та останньою версією


670

Використовуючи Git, як можна знайти різницю між поточною та останньою версією?

git diff last version:HEAD

1
Якщо ви використовуєте GitHub для хмарного розташування репо, це дуже просто: перейдіть до свого проекту та натисніть на заголовок "Здійснює" в таблиці, що відображає ваш проект
Девід Лундкіст

1
Значення "поточної та останньої версії" дійсно слід з’ясувати у питанні.
фансигнал

Відповіді:


1170

Я не дуже розумію значення "останньої версії".

Оскільки до попереднього комітету можна отримати доступ з HEAD ^, я думаю, що ви шукаєте щось на зразок:

git diff HEAD^ HEAD

Станом на Git 1.8.5 @- псевдонім для HEAD, тому ви можете використовувати:

git diff @~..@

Також буде працювати наступне:

git show

Якщо ви хочете знати різницю між головою та будь-яким зобов'язанням, ви можете скористатися:

git diff commit_id HEAD

І це запустить ваш візуальний інструмент різниці (якщо він налаштований):

git difftool HEAD^ HEAD

Оскільки порівняння з HEAD є типовим, ви можете опустити його (як вказував Orient ):

git diff @^
git diff HEAD^
git diff commit_id

Попередження

  • @ScottF та @Panzercrisis пояснюють у коментарях, що у Windows ~символом потрібно користуватися замість ^.

Я хотів чогось подібного до скоєної версії та версії до цього ... git diff head head-1
Rajeev

7
Станом на Git 1.8.5, @це псевдонім для HEAD. А так як ~і коли ^вони однакові, коли я повертаюсь назад, мені git diff @~..@набрати набагато простіше.
Андрій

80
@Andrew git showвсе ж простіше, оскільки @~..@це показано за замовчуванням.
amalloy

3
git showпросто друкує повідомлення про фіксацію, воно не видає різного роду конкретних змін, принаймні в Git 2.5.4 (Apple Git-61), тож насправді це не буде відповіддю на питання ОП.
користувач1944491

1
Проблема git showполягає в тому, що якщо HEADце об'єкт злиття, ви не отримаєте те, що очікуєте, оскільки сам припис об'єднання може не мати ніяких змін. git diff HEAD^ HEADпокаже фактичні зміни між версіями
RubenLaguna

158

Якщо припустити, що "поточна версія" є робочою директорією (невідомі модифікації), а "остання версія" є HEAD(останні внесені зміни для поточної гілки), просто зробіть

git diff HEAD

Кредит за наступне надається користувачеві Cerran.

І якщо ви завжди пропускаєте місце постановки, -aколи виконуватимете, тоді ви можете просто використовувати git diff.

Підсумок

  1. git diff показує нестандартні зміни.
  2. git diff --cached показує поетапні зміни.
  3. git diff HEAD показує всі зміни (як поетапні, так і нестандартні).

Джерело: git-diff (1) Сторінка посібника - Cerran


16
І якщо ви завжди пропускаєте місце постановки, -aколи виконуватимете, тоді ви можете просто використовувати git diff. <1> git diffпоказує нестандартні зміни. <2> git diff --cachedпоказує поетапні зміни. <3> git diff HEADпоказує всі зміни (як поетапні, так і нестандартні). Джерело: git-diff (1) Сторінка посібника
Cerran

1
Це має бути прийнятою відповіддю, оскільки вона відповідає наміру питання.
tgoneil

Як називається "поточна нестандартна версія" в git? Чи є насправді ім’я?
Матьє КАРОФФ

118

Як було відзначено на коментар по amalloy , якщо по «поточної і останньої версії» ви маєте в виду останню фіксацію і фіксації до того, що ви могли б просто використовувати

git show

5
Це те, що я шукав. Чудова відповідь.
CodeManiak

12
Використовуйте git show HEAD~1для відображення останнього, але одного, і git show HEAD~2тощо для старих комітетів. Показати лише один файл через git show HEAD~2 my_file.
Флоріан Брюкер

60

Різниця між останньою, але однією та останньою комісіями (плюс поточний стан, якщо такий є):

git diff HEAD~

або навіть (простіше набрати)

git diff @~

де @синонім HEADпоточної гілки і ~означає "дай мені батька згаданої редакції".


Мені дуже подобається git diff HEAD^(а не еквівалентна HEAD~форма). Таді легше запам’ятати такий «старий git», як я ;-)
sxc731

3
Морква - проблема в деяких терміналах. Приємно мати варіант
light24bulbs

1
Відповідь можна покращити, пояснивши, що означає ~і що @означає.
Боб Штейн

1
Якщо ми просто хочемо перевірити, що зроблено в останньому комітеті, не використовуйте це (оскільки брудні зміни впливають на розріз). Коротший синтаксис справді diff HEAD^ HEADповинен бути git diff @^!. Дивіться сторінку git-scm.com/docs/gitreitions дляr1^!
Джонні Вонг,

@JohnnyWong Дякую за роз’яснення. Я згадав про "сучасний стан", щоб не бентежити читачів.
Томілов Анатолій

53

Ви також можете це зробити так:

Порівняйте з попереднім комітетом

git diff --name-status HEAD~1..HEAD

Порівняйте з поточним та попередніми двома комітами

git diff --name-status HEAD~2..HEAD

16

Просто використовуйте cachedпрапор, якщо ви додали, але ще не зробили:

git diff --cached --color

1
Це саме те, що я шукав, коли знайшов це питання. Дякую!
Вільям Роджерс

7

Швидко і просто, якщо припустити, що ви в майстру:

    git diff (checkout_id):file.txt file.txt

Приклад:

    git diff asdfioei91819280din198:file.txt file.txt

4

По-перше, використовуйте "git log "список списків журналів для сховища.

Тепер виберіть два ідентифікатори фіксації, що стосуються двох комітів. Ви хочете побачити відмінності ( приклад - "Найпопулярніші" та "старіші" (відповідно до ваших очікувань поточної версії та деякої старої версії) ).

Далі, використовуйте:

git diff <commit_id1> <commit_id2>

або

git difftool <commit_id1> <commit_id2>

3

Якщо на верхню комітку вказано HEAD, ви можете зробити щось подібне:

commit1 -> HEAD
commit2 -> HEAD~1
commit3 -> HEAD~2

Різниця між першим і другим комітетом:

git diff HEAD~1 HEAD

Різниця між першою та третьою комісіями:

git diff HEAD~2 HEAD

Різниця між другим і третім комітом:

git diff HEAD~2 HEAD~1

І так далі...


2

Я використовую Bitbucket з Eclipse IDE з Eclipse EGit встановлений плагін.

Я порівнюю файл з будь-якої версії його історії (наприклад, SVN ).

Меню Провідник проектів → Файл → клацніть правою кнопкою миші → КомандаПоказати в історії .

Це призведе до історії всіх змін у цьому файлі. Тепер Ctrlнатисніть і виберіть будь-які дві версії → "Порівняти один з одним" .


2

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

 git diff v1.58 HEAD 

Нижче те саме, що може бути корисним для постійної інтеграції (CI) для мікросервісів у монолітному сховищі:

git diff v1.58 HEAD  --name-only | sort -u | awk 'BEGIN {FS="/"} {print $1}' | uniq
<Folder Name> 

(Кредит - https://dzone.com/articles/build-test-and-deploy-apps-independ--rom-a-mo )

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