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

1425

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

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

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

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

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

  • 57
    git status -v тоже работает. Смотрите мой ответ ниже
  • 1
    @VonC Я всегда использую это, но less каналу, как в: git status -v | less - управляемые куски :)
Теги:
diff
dvcs
git-stage

13 ответов

1775
Лучший ответ

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

git diff --cached

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

ИЗМЕНИТЬ

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

  • 26
    Если вам нужны только имена файлов, выполните следующую команду: git diff --name-only --cached каждого сообщения на stackoverflow.com/a/4525025/255187
  • 2
    Используйте это с git difftool --staged вместо git diff --staged чтобы запустить инструмент визуального сравнения по умолчанию для каждого файла. difftool может быть заменен на diff другими аргументами.
Показать ещё 1 комментарий
1371

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

Изображение 7510

git diff

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

git diff --cached

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

git diff HEAD

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

И

Более подробная информация о 365Git.

  • 0
    скринкаст на Git diff ссылка не работает
  • 6
    Боюсь, это наивно (как обычно бывает с любыми объяснениями). Если у вас есть локальные изменения в foo.c и вы не выполняете git add foo.c , то foo.c отсутствует в индексе ; это не организовано для совершения. Если git diff foo.c наивно сравнивать с рабочим foo.c для индекса, то он должен будет показать гигантский diff между пустым / несуществующим файлом и всем содержимым foo.c Таким образом, на самом деле, когда файл не существует в индексе, для этого файла git diff возвращается к использованию копии HEAD .
Показать ещё 9 комментариев
51

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

Изображение 7511

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

diffuse -m

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

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

Смотрите также: Покажите как старое, так и рабочее дерево в Git diff?

  • 0
    Спасибо, это похоже на хороший инструмент. До сих пор я считаю, что Meld - лучший инструмент визуального сравнения для Linux, но я упустил возможность различать текст из буфера обмена - Мелду требуются файлы для ввода. Diffuse допускает это, а также ручную перестройку. Попробую это на некоторое время.
  • 0
    Неработающая ссылка на diffuse.sourceforge.net, сейчас используйте sourceforge.net/projects/diffuse .
Показать ещё 3 комментария
31

Обратите внимание, что 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
  • 0
    Последняя строка должна быть git diff HEAD
  • 1
    @artur почему? Суть ответа - упомянуть, что git status -vv также включает в себя то, что делает git diff HEAD .
Показать ещё 4 комментария
17

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

git diff --cached --name-only

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

  • 2
    Пожалуйста, отредактируйте с дополнительной информацией. Ответы «только код» и «попробуй это» не приветствуются, потому что они не содержат контента для поиска и не объясняют, почему кто-то должен «попробовать это».
11

Начиная с версии 1.7 и более поздней версии:

git diff --staged
7

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

5

Для сопоставления хранилища и сравнения хранилища

$git diff --staged

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

$ git diff 

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

  • 0
    Msgstr "Для сравнения между Рабочим и Репозиторием используйте $ git diff " . Я уверен, что git diff сравнивает между Рабочим и Постановочным. См. Stackoverflow.com/a/1587952
5

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

Локально

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

git diff # look at unstaged changes

git commit -am"partial description of changes"

... напомнить больше изменений, не указанных в commit...

git diff origin/master # посмотреть на поэтапные, но не нажатые изменения

... изменить поэтапную инструкцию фиксации...

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

git push
3

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

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

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

$ git diff --cached

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


Запуск Visual Diff Tool вместо

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

$ git difftool --staged

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

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


Вы всегда можете использовать difftool вместо diff в git командах

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

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

$ git difftool -y --staged

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

Или посмотреть на diff конкретного файла, поставленного в 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 на использование другого инструмента сравнения визуальных различий по умолчанию.

  • 0
    Для ОП я подозреваю, что это лучший ответ.
2

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

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

0

По умолчанию 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;
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню