git reset против Git reset HEAD
Каждый раз, когда файл создается, Git предлагает полезные инструкции на случай, если вам нужно удалить файл:
(use "git reset HEAD <file>..." to unstage)
Однако приличные уроки по Git от Atlassian просто говорят:
git reset <file>
Это кажется более простым, так почему же разница?
3 ответа
Нет разницы (от git reset
man страница) в терминах параметра по умолчанию:
<tree-ish>/<commit>
по умолчаниюHEAD
во всех формах.
Изначально это сообщение не содержало HEAD: commit 3c1eb9c, январь 2007 г., git 1.5.0-rc1, но, поскольку значение по умолчанию не всегда известно, справочное сообщение дает понять, какой коммит вы должны сбросить.
HEAD
появляется в коммите 367c988, ноябрь 2007 г., Git 1.5.4:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
torek указывает на реальную разницу в комментариях:
Указав
HEAD
Вы гарантируете, что первое слово послеHEAD
берется в качестве имени пути.
Например, предположим, что вы запускаетеgit reset zorg
, Являетсяzorg
древовидная структура, такая как имя тега, или это путь,./zorg
?
Git ответ: это дерево, еслиgit rev-parse
может превратить его в идентификатор дерева, в противном случае это путь.
Вы можете написатьgit reset -- zorg
или жеgit reset HEAD zorg
чтобы убедиться, что git рассматривает это как путь.
Подробнее о синтаксисе двойных дефисов (--
) в разделе " Удаление ветки git с плохим именем ".
skube добавляет в комментариях:
Кроме того, они предлагают это для отмены изменений в рабочем каталоге
(т.е.git checkout -- <file>
).
Это просто кажется несовместимым сgit reset HEAD <file>
,
В то время как git reset
Страница man ясно указывает на отсутствие дерева в git reset <tree-ish> -- <paths>
значит ГОЛОВА, это не так для git checkout <tree-ish> -- <paths>
,
git checkout <tree-ish> -- <pathspec>
когда
<paths>
дано,git checkout
не переключает ветки.
Он обновляет именованные пути в рабочем дереве из файла индекса или из именованного<tree-ish>
(чаще всего коммит).
Это означает git checkout -- path
переопределит рабочее дерево тем, что уже было подготовлено (git add
"Под ред).
В то время как git reset -- PATH
(будучи смешанной формой сброса git) будет сбрасывать индекс с тем, что содержит HEAD (фактически без добавления того, что было добавлено)
git reset
а также git checkout
не используйте то же самое по умолчанию, и:
- Вы можете представить дерево по умолчанию для
git reset <tree-ish> <file>
:HEAD
,
следовательноgit reset HEAD <file>
; - но вы не можете представить параметр по умолчанию, если вы не предоставляете дерево для
git checkout
: это индекс.
следовательноgit checkout -- file
,
--
должен быть использован в git checkout
случай, так как есть только один параметр, и должно быть ясно, что параметр представляет файлы.
Обратите внимание, что git checkout HEAD files
отличается: torek упоминает в комментариях
git checkout HEAD path
копии сHEAD
commit (tree-ish) в индекс и затем в рабочий каталог.
По умолчанию, git reset
эквивалентно git reset HEAD
Цитирую справочную страницу (мой акцент):
git-reset - сброс текущего HEAD до указанного состояния.
git reset [-q] [<tree-ish>] [--] <paths>… git reset (--patch | -p) [<tree-ish>] [--] [<paths>…] git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
В первой и второй форме скопируйте записи из
в индекс. В третьей форме установите текущий заголовок ветви (HEAD) на , при необходимости изменив индекс и рабочее дерево для соответствия. / по умолчанию равен HEAD во всех формах. [...]
git reset [-q] [<tree-ish>] [--] <paths>…
Эта форма сбрасывает записи индекса для всех <путей> в их состояние в
. (Это не влияет на рабочее дерево или текущую ветвь.) Это означает, что
git reset <paths>
противоположностьgit add <paths>
,
Из этого вы видите, что нет реальной разницы в поведении.
Это кажется более простым, так почему же разница?
Поскольку они оба одинаковы, вы можете использовать самую короткую версию из двух.
В первый раз, перед тем как коммитов HEAD не существует, мы получаем:
$git reset HEAD stagedFile
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree