Подтвердить что ты не робот

Git diff HEAD vs --staged

В чем разница между git diff HEAD и git diff --staged? Я попробовал оба, но оба дают одинаковый результат.

4b9b3361

Ответ 1

Предположим, что этот вывод для git status:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   y
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   x
#

Как вы видите, есть один файл, измененный, но не поставленный для фиксации, и добавленный новый файл, который готов к фиксации.

git diff --staged будет отображаться только изменения в файлах в "ступенчатой" области.

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

Ответ 2

  • git diff Просмотр разницы между рабочей и рабочей папками
  • git diff --staged Просмотреть разницу между HEAD и Stage
  • git diff HEAD Просмотр разницы между HEAD и рабочим каталогом

enter image description here
img src

enter image description here enter image description here
img src

  • origin относится к хранилищу источника, откуда он был клонирован.
  • HEAD - это ссылка на последний коммит в текущей извлеченной ветке.
  • Постановка и индекс оба одинаковы
  • В нашей рабочей директории есть неотмеченные изменения, но Git еще не записал их в историю версий.
  • Поэтапные изменения во многом похожи на неустановленные, за исключением того, что они были помечены как зафиксированные при следующем запуске git commit

Ответ 3

Вы сможете легче увидеть разницу между этими двумя различиями с появившимся (Git 2.3. 4+, Q2 2015) git status -v -v

Смотрите коммит 4055500 от Michael J Gruber mjg, он хорошо объясняет разницу между git diff HEAD и git diff --staged:

commit/status: показать разность индекса рабочего дерева с -v -v

git commit и git status в длинном формате показывают разницу между HEAD и индексом, если дано -v. Это позволяет предварительно просмотреть сделанный коммит.

Они также перечисляют отслеживаемые файлы с неизмененными изменениями, но без различий.

-v -v ' -v -v ', который показывает разницу между индексом и рабочим деревом в дополнение к разнице индекса HEAD. Это позволяет просматривать неустановленные изменения, которые могут отсутствовать в коммите.

В случае ' -v -v ' дополнительные строки заголовка

Changes to be committed:
# and
Changes not staged for commit:

вставляются перед различий, которые равны тем, что в статусной части; последнему предшествует 50 * " - ", чтобы оно выделялось больше.

Ответ 4

Вы также можете получать разные выходные данные из двух команд diff, если вы запускаете их при неудачном слиянии, т.е. несвязанные пути.

Мне не удалось выяснить, почему он ведет себя так, но вы можете прочитать об этом здесь