Питання Як показати зміни, які були встановлені?


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

Я бачив це git-diff (1) людина сторінка каже

git diff [--options] [-] [...]

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

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


1697
2017-10-19 09:57


походження


git status -v працює теж Побачити моя відповідь нижче - VonC
@ VonC Я завжди використовую це, але підключено до less, а саме: git status -v | less - керовані шматки :) - Mr Office


Відповіді:


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

git diff --cached

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

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


2102
2017-10-19 10:07



Якщо вам потрібні лише імена файлів, виконайте наступне git diff --name-only --cached за повідомлення в stackoverflow.com/a/4525025/255187 - Michel Hébert
Використовуйте це за допомогою git difftool --staged а не git diff --staged щоб запустити засіб візуального перегляду за замовчуванням у кожному файлі. difftool може бути замінений на diff з іншими аргументами. - LightCC


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

Simple Git diffs

Git diff

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

git diff --cached

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

git diff HEAD

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

Також:

Існує трохи докладніше 365Git.


1411
2017-10-24 21:05



Це наївне, я боюсь (як це зазвичай стосовно будь-якого пояснення git). Якщо у вас є місцеві модифікації foo.c і не виконувати git add foo.c, потім foo.c є не в індексі; він не встановлений для здійснення. Якщо git diff foo.c наївно в порівнянні з робочим foo.c до індексу, тоді йому доведеться показати величезну різницю між порожнім / неіснуючим файлом і всім вмістом foo.c. Так що фактично, коли файл у індексі не існує, git diff повертається, для цього файлу, на використання HEAD скопіювати - Kaz
@Каз, строго кажучи, індекс є ні чистий шифер Це віртуальна копія HEAD на яких застосовуються поетапні зміни. Пам'ятайте, що Gіt працює, зберігаючи зміни, а не зберігаючи цілі файли. Під час створення файлу зберігаються лише внесені зміни. Якщо індекс є порожнім, як ви натякаєте на це, він не знає, як зберегти зміни в індексі, і йому доведеться зберегти весь файл як "щойно доданий" - це неправильно. - ADTC
@ Каз І індекс, і HEAD буде мати незмінну версію foo.c файл (це не фізичні копії, а лише логічні копії для вас і мене. Для Gіt вони є однаковими потоками даних, до яких відносяться кожен фікс, який коли-небудь включав цей файл). Так що коли ти робиш git diff на повністю незахищений foo.c це дійсно не повертається до HEAD він насправді робить різницю з індексом (який, як виявляється, містить точно таку ж версію файлу як HEAD робить) Отже графіка правильна. - ADTC
Привіт, я хотів би знати, що це означає "індекс"в цьому контексті? Спасибі! - Gab是好人
@Abizern Отже, індекс - це поетапні зміни? - Gab是好人


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

Screenshot of diffuse with staged and unstaged edits

Зателефонуйте йому

diffuse -m

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

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

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


52
2018-03-18 07:22



Спасибі, це виглядає як хороший інструмент. Я виявив, що Meld - найкращий інструмент візуального перегляду для Linux поки що, але я пропустив можливість відмінного тексту з буфера обміну - Meld вимагає файлів для введення. Це дозволить Diffuse, а також ручне настроювання. Попробуй це на деякий час. - Drew Noakes
Помилка посилання на diffuse.sourceforge.net, скористатися sourceforge.net/projects/diffuse зараз. - user1133275
brew install diffuse працює на ОС X. Не показує 3 панелі, якщо і нестабілізовані, і поетапні зміни - чи ви мали на увазі зміни, які ще не були в індексі? - Brent Faust
Яка версія розсіяна у вас є? Так - якщо ви додаєте файл, а потім модифікуєте його локально, він повинен відображати три панелі. - krlmlr
Ви також можете налаштувати дифузний як ваш за замовчуванням дифтол і використовувати цей вбудований механізм / інструмент / псевдонім для його запуску. Подивіться на мою відповідь тут: <stackoverflow.com/a/45684512/6501141>; - LightCC


Зауважте, що 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

38
2017-08-31 10:05



Останній рядок повинен бути git diff HEAD - artur
@artur чому? Точка відповіді - згадати це git status -vv також включає те, що git diff HEAD робить - VonC
Не працює git version 1.8.3.1. Я знаю, що це старе, але якщо можливо, зверніть увагу, коли цей прапор був введений. - onebree
@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


Ви можете скористатися цією командою.

git diff --cached --name-only

The --cachedопція git diff означає отримати поетапні файли, а також --name-only Опція означає отримати лише назви файлів.


23
2017-07-19 17:39



Будь-ласка, відредагуйте додаткову інформацію. Тільки коди та "спробуйте це" не рекомендуються, оскільки вони не містять вмісту для пошуку та не пояснюють, чому хтось повинен "спробувати це". - abarisone


Від версії 1.7 і пізнішої версії слід:

git diff --staged

15
2017-08-14 23:33





Використання VISUAL DIFF TOOL

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

Найкращі відповіді тут правильно показують, як переглянути кешовані / поетапні зміни в 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

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

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

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


12
2018-03-14 14:30



Для OP я підозрюю, що це найкраща відповідь. - Matt Ruwe


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


7
2017-10-14 18:32