Здесь есть несколько ответов с неправильным представлением о git reset --soft
.В то время как есть определенное условие, при котором git reset --soft
изменит только HEAD
(начиная с состояния отсоединенной головки), обычно (и для предполагаемого использования), перемещает ссылку ветвления, которую вы в настоящее время извлекли. Конечно, это не может быть сделано, если вы не отметили ветку (отсюда определенное условие, где git reset --soft
изменит только HEAD
).
Я считаю, что это лучший способ думать о git reset
.Вы не просто двигаете HEAD
( все делает это ), вы также перемещаете ref ref ответвления, например, master
.Это похоже на то, что происходит, когда вы запускаете git commit
(текущая ветвь перемещается вместе с HEAD
), за исключением того, что вместо создания (и перехода к) нового коммита вы переходите к предыдущий коммит.
Это точка reset
, изменяющая ответвление на что-то отличное от нового коммита, без изменения HEAD
. Вы можете увидеть это в примере документации:
Отменить коммит, сделав его веткой темы
$ git branch topic/wip (1)
$ git reset --hard HEAD~3 (2)
$ git checkout topic/wip (3)
- Вы сделали некоторые коммиты, но понимаете, что они преждевременныбыть в "мастер" ветке.Вы хотите продолжить полировать их в ветке темы, поэтому создайте ветку "topic / wip" вне текущей HEAD.
- Перемотайте ветку master, чтобы избавиться от этих трех коммитов.
- Switchв ветку "topic / wip" и продолжайте работать.
Какой смысл этой серии команд?Вы хотите переместить ветку , здесь master
, поэтому, пока вы master
извлечены, вы запускаете git reset
.
Ответ с верхним голосом здесь, как правило, хорош, ноЯ подумал, что добавлю это, чтобы исправить несколько ответов с ошибочными представлениями.
Изменить ветку
git reset --soft <ref>
: сбрасывает указатель ветки для текущей извлеченной ветки в фиксацию по указанномуссылка, .Файлы в вашем рабочем каталоге и индексе не изменены.Выполнение этого этапа вернет вас туда, где вы были до команды git reset
.
Измените свой индекс тоже
git reset --mixed <ref>
или эквивалентно
git reset <ref>
:
Делает то, что делает --soft
И , также сбрасывает индекс в соответствии с фиксацией по указанной ссылке.В то время как git reset --soft HEAD
ничего не делает (потому что говорит, что перемещает извлеченную ветвь в извлеченную ветвь), git reset --mixed HEAD
, или, что эквивалентно, git reset HEAD
, является обычной и полезной командой, потому что она сбрасывает индекс до состояния вашего последнего коммита.
Изменить также ваш рабочий каталог
git reset --hard <ref>
: делает то, что --mixed
делает И также перезаписывает ваш рабочий каталог.Эта команда похожа на git checkout <ref>
, за исключением того, что (и это критический момент для reset
) все формы git reset
перемещают ветку, на которую ссылается ref HEAD
.
Примечание о том, "такая и такая команда перемещает ГОЛОВУ":
Бесполезно говорить, что команда перемещает HEAD
.Любая команда, которая меняет ваше местоположение в истории коммитов, перемещает HEAD
.Вот что такое HEAD
, указатель на то, где вы находитесь.HEAD
это вы , и поэтому будете двигаться, когда вы это делаете.