Как показать изменения, которые были организованы?

2141

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

Я видел, что на странице руководства git-diff (1) написано

git diff [--options] [-] […]

Эта форма предназначена для просмотра изменений, внесенных вами по отношению к индексу (промежуточная область для следующего коммита). Другими словами, различия в том, что вы можете сказать git для дальнейшего добавления в индекс, но вы все еще этого не сделали. Вы можете внести эти изменения, используя git-add (1).

К сожалению, я не могу понять это. Должна быть какая-то удобная строчка, для которой я мог бы создать псевдоним, верно?

Фрерих Раабе
источник
76
git status -vтоже работает Смотрите мой ответ ниже
VonC
3
@VonC Я всегда использую это, но по трубопроводу less, как в: git status -v | less- управляемые куски :)
Мистер Офис

Ответы:

2613

Это должно быть просто:

git diff --cached

--cachedозначает показывать изменения в кеше / индексе (т.е. поэтапные изменения) по отношению к текущему HEAD. --stagedэто синоним для --cached.

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

CB Bailey
источник
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 [[others]], только мои 2 цента
Виталий Терзиев
И для просмотра изменений в одном поэтапном файле, будет работать следующее:git diff --cached -- <stagedfile>
ObviousChild
1606

Простая графика делает это более понятным:

Простой Git diffs

мерзавец

Показывает изменения между рабочим каталогом и индексом. Это показывает, что было изменено, но не подготовлено для фиксации.

git diff - кэшированный

Показывает изменения между индексом и заголовком (который является последним коммитом в этой ветви). Это показывает, что было добавлено в индекс и подготовлено для фиксации.

git diff HEAD

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

Также :

Немного подробнее о 365Git.

Abizern
источник
8
Боюсь, это наивно (как обычно бывает с любыми объяснениями). Если у вас есть локальные изменения в 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на полностью unstaged foo.cэто на самом деле не отступая к HEADнему на самом деле делают различия с индексом (что происходит , чтобы содержать ту же самую версию файла , как это 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?

krlmlr
источник
1
Спасибо, это похоже на хороший инструмент. До сих пор я считаю, что Meld - лучший инструмент визуального сравнения для Linux, но я упустил возможность различать текст из буфера обмена - Мелду требуются файлы для ввода. Diffuse допускает это, а также ручную перестройку. Попробую это на некоторое время.
Дрю Ноакс
Неработающая ссылка на diffuse.sourceforge.net, сейчас используйте sourceforge.net/projects/diffuse .
user1133275
1
brew install diffuseработает на OS X. Не показывает 3 панели, если внесенные и поэтапные изменения - вы имели в виду изменения еще не в индексе?
Брент Фауст
Какая версия diffuse у вас есть? Да - если вы добавляете файл, а затем изменяете его локально, он должен отображать три панели.
krlmlr
Вы также можете установить diffuse в качестве стандартного difftool и использовать этот встроенный механизм / tool / alias для его запуска. Смотрите мой ответ здесь: < stackoverflow.com/a/45684512/6501141 >
LightCC
50

Обратите внимание, что git status -v также показывает поэтапные изменения! (имеется в виду, что вам нужно выполнить поэтапное git addизменение - некоторые изменения. Никаких поэтапных изменений, никаких изменений с git status -v.
Это происходит с Git 1.2.0, февраль 2006 г. )

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

И это собирается стать еще более полным: см. « Показать как промежуточное, так и рабочее дерево в git diff? » (Git 2.3.4+, второй квартал 2015 года):

git status -v -v
VonC
источник
Последняя строка должна бытьgit diff HEAD
артур
2
@artur почему? Суть ответа состоит в том, чтобы упомянуть, что git status -vvтакже включает в себя то, что git diff HEADделает.
VonC
Не работает на git version 1.8.3.1. Я знаю, что он старый, но, если возможно, обратите внимание, когда этот флаг был введен.
августа
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.
1
25

Вы можете использовать эту команду.

git diff --cached --name-only

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

Яш Патадия
источник
2
Пожалуйста, отредактируйте с дополнительной информацией. Ответы «только код» и «попробуй это» не приветствуются, потому что они не содержат контента для поиска и не объясняют, почему кто-то должен «попробовать это».
abarisone
2
Не уверен, почему я хотел бы этого, с --name-onlyвозможностью, которую я мог бы также использовать регулярныйgit status
Саймон Форсберг
16

С версии 1.7 и более поздних она должна быть:

git diff --staged
ML13
источник
15

ИСПОЛЬЗОВАНИЕ ВИЗУАЛЬНОГО DIFF ИНСТРУМЕНТА

Ответ по умолчанию (в командной строке)

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

$ git diff --cached

или $ git diff --stagedкоторый является псевдонимом.


Вместо этого запускается инструмент Visual Diff

Ответ по умолчанию выдаст изменения diff в git bash (т.е. в командной строке или в консоли). Для тех, кто предпочитает визуальное представление различий поэтапного файла, в git доступен скрипт, который запускает инструмент визуального сравнения для каждого просматриваемого файла, а не показывает их в командной строке, который называется difftool:

$ git difftool --staged

Это будет делать то же самое git diff --staged, что и за исключением того, что каждый раз, когда запускается инструмент diff (т. Е. Каждый раз, когда файл обрабатывается 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>>

Или обратитесь к справочной странице difftool, чтобы узнать, как настроить git для использования другого инструмента визуального сравнения по умолчанию.


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

Часть настройки 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
LightCC
источник
14

Для сравнения с промежуточной областью и репозиторием (последним коммитом) используйте

 $git diff --staged

Команда сравнивает ваши изменения 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 Clients .

nobar
источник
0

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

Сэм
источник