Как мне показать внесенные изменения?

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

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

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

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

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


person Frerich Raabe    schedule 19.10.2009    source источник
comment
git status -v тоже работает. См. мой ответ ниже   -  person VonC    schedule 18.03.2015
comment
@VonC Я всегда использую это, но подключено к less, например: git status -v | less - управляемые блоки :)   -  person Mr Office    schedule 25.07.2016


Ответы (14)


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

git diff --cached

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

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

person CB Bailey    schedule 19.10.2009
comment
Если вам нужны только имена файлов, выполните следующие git diff --name-only --cached для каждого сообщения на странице stackoverflow.com/a/4525025/255187 - person Michel Hébert; 26.07.2012
comment
Используйте это с git difftool --staged, а не с git diff --staged, чтобы запустить инструмент визуального сравнения по умолчанию для каждого файла. difftool также можно заменить на diff любыми другими аргументами. - person LightCC; 15.08.2017
comment
И вы можете использовать git difftool --staged -d, чтобы различать два каталога в визуальном средстве, а не по одному файлу за раз. - person Robert Bernstein; 13.08.2018
comment
поскольку этот помечен как ответ и сначала отображается он должен включать git diff вверху, затем git [[others]], только мои 2 цента - person Vitaliy Terziev; 02.08.2019
comment
А чтобы просмотреть изменения в одном поэтапном файле, будет работать следующее: git diff --cached -- <stagedfile> - person ObviousChild; 05.03.2020

Простая графика проясняет это:

Простые различия Git

git diff

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

git diff --cached

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

git diff HEAD

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

Также:

Подробнее о 365Git.

person Community    schedule 19.10.2009
comment
Боюсь, это наивно (как обычно бывает с любым объяснением git). Если у вас есть локальные изменения в foo.c и вы не выполняете git add foo.c, тогда foo.c отсутствует в индексе; он не предназначен для фиксации. Если git diff foo.c наивно сравнивать рабочий foo.c с индексом, то он должен был бы показать гигантскую разницу между пустым / несуществующим файлом и всем содержимым foo.c. Фактически, когда файл не существует в индексе, git diff для этого файла возвращается к использованию копии HEAD. - person Kaz; 04.11.2014
comment
@Kaz, строго говоря, индекс - это не чистый лист. Это виртуальная копия HEAD, к которой применяются поэтапные изменения. Помните, что Git работает, сохраняя изменения, а не целые файлы. Когда вы обрабатываете файл, он сохраняет только внесенные изменения. Если индекс пуст, как вы подразумеваете, он не будет знать, как сохранить изменения в индексе, и ему придется сохранить весь файл как недавно добавленный - что неверно. - person ADTC; 04.02.2015
comment
@Kaz И индекс, и HEAD будут иметь неизмененную версию foo.c файла (они не являются физическими копиями, а просто логическими копиями для вас и меня. Для Git это тот же поток данных, что и каждый коммит, когда-либо задействовавший этот файл. относится к). Поэтому, когда вы делаете git diff на полностью неустановленном foo.c, он на самом деле не возвращается к HEAD, он фактически выполняет различие с помощью индекса (который, как оказалось, содержит ту же версию файла, что и HEAD). Итак, график правильный. - person ADTC; 04.02.2015
comment
Здравствуйте, я хотел бы знать, что означает индекс в этом контексте? Спасибо! - person Gab是好人; 18.04.2016
comment
@Gab Когда вы меняете файл, он не будет автоматически добавлен в следующий коммит. Для этого вам нужно выполнить git add операцию. Вот что такое индекс. Сделанные изменения будут зафиксированы в репозитории при следующей фиксации. - person Abizern; 18.04.2016
comment
@Abizern Значит индекс - это поэтапные изменения? - person Gab是好人; 18.04.2016
comment
Так как эти параметры соотносятся с git status -v? - person Tom Russell; 01.11.2017
comment
@TomRussell git status -v эквивалентно git diff --cached (плюс git status, конечно) - person wisbucky; 29.11.2017
comment
@Gab 是 好人 В частности, индекс содержит все отслеживаемые файлы, включая поэтапные изменения. См. stackoverflow.com/a/47543410 - person wisbucky; 29.11.2017

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

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

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

git status -v -v
person VonC    schedule 18.03.2015
comment
Последняя строка должна быть git diff HEAD - person artur; 31.05.2015
comment
@artur почему? Суть ответа - упомянуть, что git status -vv также включает в себя то, что делает git diff HEAD. - person VonC; 31.05.2015
comment
Не работает на git version 1.8.3.1. Я знаю, что он старый, но, если возможно, обратите внимание, когда этот флаг был введен. - person onebree; 01.06.2015
comment
@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 г.) - person VonC; 02.06.2015
comment
@VonC, это была моя ошибка ... Я сделал git diff -v. - person onebree; 02.06.2015
comment
Большое спасибо! Я git diff настроил использование графического интерфейса для сравнения, но часто мне просто нужна консольная распечатка изменений. Это именно то. - person Nostalg.io; 25.09.2015

Если вас интересует визуальный параллельный вид, это может сделать инструмент визуального сравнения diffuse. . Он даже покажет три панели, если некоторые, но не все изменения внесены. В случае конфликтов будет даже четыре панели.

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

Вызовите его с помощью

diffuse -m

в вашей рабочей копии Git.

Если вы спросите меня, лучшая визуальная разница, которую я видел за десять лет. Кроме того, это не относится к Git: он взаимодействует с множеством других VCS, включая SVN, Mercurial, Bazaar, ...

См. Также: Показать как поэтапное, так и рабочее дерево в git diff?

person krlmlr    schedule 24.10.2012
comment
Спасибо, похоже, хороший инструмент. Я обнаружил, что Meld пока лучший инструмент визуального сравнения для Linux, но мне не хватало возможности различать текст из буфера обмена - Meld требует файлов для ввода. Diffuse позволяет это, а также ручное выравнивание. Попробую какое-то время. - person Drew Noakes; 26.01.2013
comment
Неработающая ссылка на diffuse.sourceforge.net, пока используйте sourceforge.net/projects/diffuse. - person user1133275; 06.07.2015
comment
brew install diffuse работает в OS X. Не показывает 3 панели, если и неустановленные, и поэтапные изменения - вы имели в виду, что изменений еще нет в индексе? - person Brent Faust; 04.02.2016
comment
Какая у вас версия диффузного? Да - если вы добавляете файл, а затем изменяете его локально, он должен показать три панели. - person krlmlr; 04.02.2016
comment
Вы также можете установить diffuse в качестве difftool по умолчанию и использовать этот встроенный механизм / инструмент / псевдоним для его запуска. См. Мой ответ здесь: ‹stackoverflow.com/a/45684512/6501141 - person LightCC; 19.04.2018

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

 $git diff --staged

Команда сравнивает ваши поэтапные ($ git add fileName) изменения с вашей последней фиксацией. Если вы хотите увидеть, что вы поставили для следующего коммита, вы можете использовать git diff --staged. Эта команда сравнивает ваши поэтапные изменения с вашей последней фиксацией.

Для сравнения рабочего и промежуточного уровней используйте

$ git diff 

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

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

person Goyal Vicky    schedule 25.02.2017
comment
Для сравнения работы с репозиторием используйте $ git diff. Я почти уверен, что git diff сравнивает Рабочие и Промежуточные. См. stackoverflow.com/a/1587952 - person wisbucky; 21.12.2017

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

git diff --cached --name-only

Параметр --cached параметра git diff означает получение поэтапных файлов, а параметр --name-only означает получение только имен файлов.

person Yash Patadia    schedule 31.08.2016
comment
Пожалуйста, отредактируйте с дополнительной информацией. Только код и пробовать эти ответы не рекомендуется, потому что они не содержат доступного для поиска контента и не объясняют, почему кто-то должен это попробовать. - person abarisone; 31.08.2016
comment
Не уверен, зачем мне это нужно, с опцией --name-only я мог бы также использовать обычный git status - person Simon Forsberg; 31.07.2019

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

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

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

$ git diff --cached

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



Запуск инструмента Visual Diff вместо

Ответ по умолчанию выдаст изменения 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, чтобы узнать, как настроить 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
person LightCC    schedule 14.08.2017

Начиная с версии 1.7 и новее это должно быть:

git diff --staged
person ML13    schedule 19.07.2016

Если ваши намерения состоят в том, чтобы направить push-таргет на ветку удаленного репо, и ваш первый проход в журнале изменений фиксации был неполным, вы можете исправить оператор фиксации, прежде чем нажимать таким образом.

Локально

... внести некоторые изменения ...

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
person Marc Condon    schedule 14.10.2015

Если у вас есть несколько файлов с поэтапными изменениями, может быть более практичным использовать git add -i, затем выбрать 6: diff и, наконец, выбрать интересующий вас файл (ы).

person Fred Schoen    schedule 14.03.2012

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

$ 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;
person Deepak Dixit    schedule 20.11.2017

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

См. Мой тесно связанный ответ на странице Как удалить файл из индекса в git?, а также в этом официальном каталоге Git - клиенты графического интерфейса.

person Brent Bradburn    schedule 13.04.2016

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

person sam    schedule 03.08.2016

--cached у меня не сработал ... где, вдохновленный git log

git diff origin/<branch>..<branch> сделал.

person ergohack    schedule 24.06.2020