Як я показую зміни, які відбулися?


2137

Я здійснив кілька змін, які слід здійснити; як я можу побачити різницю всіх файлів, які ставлять для наступного комітету? Мені відомо про статус git , але я хотів би бачити фактичні розбіжності - не лише назви файлів, які інсценізуються.

Я бачив, що на сторінці людини git-diff (1) написано

git diff [--використання] [-] […]

Ця форма призначена для перегляду внесених вами змін відносно індексу (область постановки для наступних комісій). Іншими словами, відмінності - це те, що ви могли б сказати git для подальшого додавання до індексу, але ви досі цього не зробили. Можна змінити ці зміни за допомогою git-add (1).

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


76
git status -vпрацює теж. Дивіться мою відповідь нижче
VonC

3
@ VonC Я завжди використовую це, але трубопровід less, як у: git status -v | less- керовані шматки :)
Містер Офіс

Відповіді:


2608

Це просто повинно бути:

git diff --cached

--cachedозначає показати зміни кешу / індексу (тобто поетапні зміни) щодо поточного HEAD. --stagedє синонімом для --cached.

--stagedі --cachedне вказує на HEAD, лише різницю стосовно HEAD. Якщо вишня вибере, що робити, використовуючи git add --patch(або git add -p), --stagedповерне те, що поставлено.


35
Якщо ви хочете лише імена файлів, виконайте такі дії git diff --name-only --cachedза статком: stackoverflow.com/a/4525025/255187
Мішель Геберт,

4
Використовуйте це, git difftool --stagedа не git diff --stagedдля запуску за замовчуванням візуального розрізненого інструменту для кожного файлу. difftoolможе бути замінено diffтакож будь-якими іншими аргументами.
LightCC

І ви можете використовувати git difftool --staged -dдля розмежування двох каталогів у візуальному інструменті, а не в одному файлі за раз.
Роберт Бернштейн

оскільки цей позначений як відповідь і показується спочатку, він повинен містити git diff вгорі, потім git [[інші]], лише мої 2 копійки
Віталій Терзієв,

А щоб переглянути зміни в одному поетапному файлі, буде працювати наступне:git diff --cached -- <stagedfile>
ObviousChild

1604

Проста графіка робить це зрозумілішим:

Simple Git відрізняється

git diff

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

git diff - кешована

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

git diff HEAD

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

Також :

Є трохи більше деталей про 365Git.


8
Я боюсь, що це наївно (як це буває з будь-яким поясненням git). Якщо ви маєте місцеві модифікації foo.cта не виконуєте їх git add foo.c, то foo.cце не входить до індексу ; вона не ставиться для здійснення. Якщо git diff foo.cнаївно порівнювати робочий foo.cз індексом, то він повинен був би показати величезну різницю між порожнім / неіснуючим файлом і всім вмістом foo.c. Тож насправді, коли файл не існує в індексі, він git diffповертається, використовуючи HEADкопію.
Каз

9
@Kaz строго кажучи, індекс не є порожнім сланцем. Це віртуальна копія того, HEADна який застосовуються поетапні зміни. Пам'ятайте, що Git працює, зберігаючи зміни, а не зберігаючи цілі файли. Коли ви ставите файл, він зберігає лише внесені зміни. Якщо індекс порожній, як ви маєте на увазі, він не знатиме, як зберегти зміни в індексі, і йому доведеться зберегти весь файл як "нещодавно доданий" - що неправильно.
ADTC

8
@Kaz І індекс, і HEADзаповіт матимуть незмінну версію foo.cфайлу (це не фізичні копії, а просто логічні копії для вас і мене. Для Git - це той самий потік даних, на який посилається кожен комітет, який коли-небудь залучав цей файл. ). Отже, коли ви працюєте git diffз повністю нестандартним, foo.cце насправді не повертається до того, що HEADвін фактично робить розріз з Index (який, як правило, містить таку саму версію файлу, що HEADі). Отже графіка правильна.
ADTC

2
Здрастуйте, я хотів би знати, що означає " індекс " у цьому контексті? Дякую!
Габ 是 好人

2
@TomRussell git status -vеквівалентний git diff --cached(плюс git statusзвичайно)
wisbucky

54

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

Скріншот дифузного з поетапним та нестандартним редагуванням

Викликайте його с

diffuse -m

у вашій робочій копії Git.

Якщо ви запитаєте мене, найкраща візуальна різниця, яку я бачив протягом десяти років. Крім того, він не специфічний для Git: він взаємодіє з безліччю інших VCS, включаючи SVN, Mercurial, Bazaar, ...

Дивіться також: Показати як поетапне, так і робоче дерево в git diff?


1
Дякую, це виглядає як приємний інструмент. Я вважав, що Meld є найкращим візуальним інструментом для розробки Linux досі, але мені не вдалося розрізнити текст із буфера обміну - Meld вимагає файлів для введення. Дифуз дозволяє це, а також ручне перестроювання. Спробуємо це деякий час.
Дрю Ноакс

Перерване посилання на diffuse.sourceforge.net, використовуйте sourceforge.net/projects/diffuse зараз.
користувач1133275

1
brew install diffuseпрацює в ОС X. Не відображає 3 панелі, якщо зміни, як нестандартні, так і поетапні - ви мали на увазі зміни ще не в індексі?
Brent Faust

Яка версія дифузної у вас? Так - якщо додати файл, а потім змінити його локально, він повинен відображати три області.
krlmlr

Ви також можете встановити дифузний диффузол за замовчуванням і використовувати цей вбудований механізм / інструмент / псевдонім для його запуску. Дивіться моя відповідь тут: < stackoverflow.com/a/45684512/6501141 >
LightCC

50

Зауважте, що git status -v також показано поетапні зміни! (тобто означає, що вам потрібно здійснити постановку - git add- деякі зміни. Ні поетапних змін, ні відмінностей git status -v.
Це відбувається з Git 1.2.0, лютий 2006 р. )

У своїй довгій формі (за замовчуванням) git statusмає недокументований варіант «багатослівний», який фактично відображає різницю між HEAD та індексом.

І ось воно стане ще більш повним: див. " Показати і поетапне, і робоче дерево в git diff? " (Git 2.3.4+, Q2 2015):

git status -v -v

Останній рядок має бутиgit diff HEAD
Артур

2
@artur чому? Суть відповіді полягає в згадці, що git status -vvтакож включає те, що git diff HEADробить.
VonC

Не працює на git version 1.8.3.1. Я знаю, що це старе, але якщо можливо, зверніть увагу, коли цей прапор був представлений.
onebree

2
@onebree 1.8.3.1 - червень 2013 року. Але git status -vстарше ( github.com/git/git/commit/… , git 1.2.0, лютий 2006!). Зауважте, що він відображає різницю між індексом та HEAD: якщо ви додали що-небудь до індексу (ні git add), то git status -vвін не відображатиме жодної різниці. git status -v -vє останнім часом (Git 2.3.4, березень 2015 р.)
VonC

@VonC це була моя помилка ... я зробив git diff -v.
onebree

25

Ви можете використовувати цю команду.

git diff --cached --name-only

--cachedВаріант git diffкоштів , щоб в постановці файлів, а --name-onlyопція означає отримати тільки імена файлів.


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

2
Не впевнений, чому я хотів би цього, з --name-onlyваріантом, який я міг би також використовувати звичайнийgit status
Simon Forsberg

16

З версії 1.7 і пізнішої повинно бути:

git diff --staged

15

ВИКОРИСТАННЯ ВІЗУАЛЬНОГО ІНСТРУМЕНТУ ДІФА

Відповідь за замовчуванням (у командному рядку)

Верхні відповіді тут правильно показують, як переглянути кешовані / поетапні зміни в Index:

$ git diff --cached

або $ git diff --stagedякий псевдонім.


Замість цього запуск інструмента Visual Diff

Відповідь за замовчуванням викличе різні зміни в git bash (тобто в командному рядку або в консолі). Для тих, хто віддає перевагу візуальному зображенню поетапних відмінностей у файлі, в git є скрипт, який запускає інструмент візуального розгляду для кожного переглянутого файлу, а не показує їх у командному рядку, який називається difftool:

$ git difftool --staged

Це зробить те саме, що git diff --staged, за винятком будь-якого запуску інструмента "diff" (тобто кожного разу, коли файл обробляється різницею), він запустить інструмент візуального розрізнення за замовчуванням (у моєму середовищі це kdiff3 ).

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


Завжди можна використовувати difftoolзамість diffкоманд git

Для всіх ваших візуальних відмінностей git difftoolбуде працювати замість будь-якої git diffкоманди, включаючи всі параметри.

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

$ git difftool -y --staged

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

Або подивитися на відмінність певного файлу, який розміщено у Index:

$ git difftool -y --staged <<relative path/filename>>

Усі параметри див. На сторінці чоловіка:

$ git difftool --help


Налаштування Visual Git Tool

Щоб використовувати візуальний інструмент git, відмінний від типового, скористайтеся -t <tool>опцією:

$ git difftool -t <tool> <<other args>>

Або перегляньте сторінку "difftool man", як налаштувати git для використання іншого за замовчуванням візуального розрізнення інструментів.


Приклад .gitconfigзаписів для vscode як інструмента diff / merge

Частина налаштування difftool передбачає зміну .gitconfigфайлу або через команди git, які змінюють його за кадром, або безпосередньо редагуючи його.

Ви можете знайти свій .gitconfigдомашній каталог, наприклад, ~в Unix або звичайно c:\users\<username>в Windows).

Або ви можете відкрити користувача .gitconfigу своєму редакторі Git за замовчуванням за допомогою git config -e --global.

Ось приклади записів у мого глобального користувача .gitconfigдля VS Code як інструмента розрізнення, так і інструмента злиття:

[diff]
    tool = vscode
    guitool = vscode
[merge]
    tool = vscode
    guitool = vscode
[mergetool]
    prompt = true
[difftool "vscode"]
    cmd = code --wait --diff \"$LOCAL\" \"$REMOTE\"
    path = c:/apps/vscode/code.exe
[mergetool "vscode"]
    cmd = code --wait \"$MERGED\"
    path = c:/apps/vscode/code.exe

14

Для використання в порівнянні використання Staging Area vs Repository (остання фіксація)

 $git diff --staged

Команда порівнює ваші поетапні ( $ git add fileName) зміни з вашим останнім введенням. Якщо ви хочете побачити, що ви інсценізували, що перейде до вашої наступної комісії, ви можете використовувати git diff --staged. Ця команда порівнює ваші поетапні зміни з вашим останнім введенням.

Для порівняння «Робота проти та постановки»

$ git diff 

Команда порівнює те, що знаходиться у вашому робочому каталозі, і те, що знаходиться у вашій області постановки. Важливо зауважити, що git diff сам по собі не відображає всіх змін, внесених з моменту останньої передачі, - лише зміни, які досі не встановлені. Якщо ви виконали всі свої зміни ( $ git add fileName), git diff не дасть результатів.

Крім того, якщо ви ставите файл ( $ git add fileName) і потім редагуєте його, ви можете використовувати git diff, щоб побачити зміни у файлі, які ставляться, та зміни, які не змінюються.


Msgstr "Для порівняння" Робота з репозиторіями $ git diff" . Я майже впевнений, що git diffпорівнює "Робота проти та інсценізація". Див stackoverflow.com/a/1587952
wisbucky

8

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

Місцево

... внести деякі зміни ...

git diff # look at unstaged changes

git commit -am"partial description of changes"

... пригадайте більше змін, не згаданих у комітеті ...

git diff origin / master # дивіться на поетапні, але не насунуті зміни

... змінити заяву про поетапну комісію ...

git commit --amend -m"i missed mentioning these changes ...."

git push

7

Якщо у вас є декілька файлів із поетапними змінами, він може бути більш практичним у використанні git add -i, а потім виберіть 6: diffі, нарешті, виберіть потрібний файл (и).


6

За замовчуванням git diff використовується для відображення змін, які не додаються до списку оновлених файлів git. Але якщо ви хочете , щоб показати зміни , які додаються або stagged , то вам необхідно надати додаткові параметри , які дозволять GIT знати , що ви зацікавлені в stagged або додані файли дифф .

$ git diff          # Default Use
$ git diff --cached # Can be used to show difference after adding the files 
$ git diff --staged # Same as 'git diff --cached' mostly used with latest version of git 

Приклад

$ git diff 
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
--- a/x/y/z.js 
+++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

-        if (a)
+        if (typeof a !== 'undefined')
             res = 1;
         else
             res = 2;

$ git add x/y/z.js
$ git diff
$

Після додавання файлів ви не можете використовувати типовий параметр 'git diff'. Вам потрібно зробити так: -

$ git diff --cached
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
    --- a/x/y/z.js 
    +++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

    -        if (a)
    +        if (typeof a !== 'undefined')
                 res = 1;
             else
                 res = 2;

2

git guiі git-colaце графічні утиліти, які дозволяють переглядати та маніпулювати індексом. Вони включають прості візуальні відмінності для поетапних файлів, а git-colaтакож можуть запустити більш складний інструмент візуального розрізнення.

Дивіться мою близьку відповідь у розділі Як видалити файл з індексу в git? , а також цей офіційний каталог клієнтів Git - GUI .


0

Подумайте і про цей gitkінструмент, забезпечений git і дуже корисний для перегляду змін

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