Ответ ElpieKay правильный (и я проголосовал за него), но он может помочь вам подумать о проблеме, если вы сделаете шаг назад и подумаете о commits и о том, как работает Git .
Каждый коммит содержит несколько вещей, которые мы можем разбить на две основные категории: data и metadata . data в коммите - это снимок исходного кода, а метаданные - это дополнительная информация о данных, таких как, кто сделал снимок, когда и так далее. on (и, что важно, родительский хэш-идентификатор для родителя этого коммита, или, если это коммит слияния, все его родительские хеш-идентификаторы, но я думаю, что теперь эта часть хорошо контролируется). Обратите внимание, что все внутри коммита замораживается на все время . Вы не можете изменить какую-либо часть данных или метаданных.
Фактически, это относится к всем внутренним объектам Git. Идентификатор хэша объекта Git представляет собой криптографическую контрольную сумму содержимого этого объекта. Это отлично подходит для архивирования - каждый сделанный коммит не может быть изменен никогда , но совершенно бесполезен для выполнения любой новой работы . Чтобы выполнить новую работу, Git должен предоставить несколько мест, где файлы могут быть изменены .
У каждой системы контроля версий есть эта проблема, и в целом все они решают ее одинаково: место, где вы работаете с вашим файлом, - ваше рабочее дерево . Файлы в рабочем дереве податливы. Файлы в коммитах нет. Это означает, что есть что-то принципиально иное в рабочем дереве, чем в коммите. Рабочее дерево может быть предложенным коммитом, но оно все еще податливо, так что это не фактический коммит. (У него также нет метаданных.)
Итак, в Git рабочее дерево не имеет хеш-идентификатора . Но по какой-то причине Git делает это еще дальше. Вместо того, чтобы рабочее дерево было предложено следующим коммитом, Git добавляет третью сущность, расположенную между HEAD
- текущим коммитом - и рабочим деревом. Этот третий объект называется index , или промежуточной областью , или даже иногда кеш . (Вы увидите все три имени в документации Git. Все они ссылаются на одно и то же.) В этом индексе Git хранит предложенный следующий коммит. Затем Git предоставляет такие команды, как git add
, которые копируют из рабочего дерева (где у вас есть файлы и вы можете с ними работать) до индекса (для обновления предложенного следующего коммита) .
Это означает, что git diff
должен иметь возможность:
- сравнить фиксацию с фиксацией
- сравнить фиксацию с индексом
- сравнить коммит с рабочим деревом
- сравнить индекс с рабочим деревом
Он предоставляет четыре различных способа сделать это, в зависимости от аргументов и --cached
флага, который вы передаете в git diff
:
git diff <em>hash1</em> <em>hash2</em>
сравнение фиксации с фиксацией
git diff --cached <em>hash</em>
сравнивает фиксацию с индексом
git diff <em>hash</em>
сравнивает коммит с рабочим деревом
git diff
сравнивает индекс с рабочим деревом
Выберите, какой вы хотите, добавьте -- <path>
, чтобы ограничить вывод diff, и все готово.