Помимо работы с индексом (см. выше), git reset позволяет сбросить состояние
проекта до какого-либо коммита в истории. В git данное действие может быть двух видов: «мягкого»(soft reset) и «жесткого» (hard reset).
«Мягкий» (с ключом "--soft") сброс оставит нетронутыми ваши индекс (а практика показывает, что тронет индекс) и все дерево файлов и директорий проекта, вернется к работе с указанным коммитом. То есть, файлы в рабочем каталоге останутся нетронутыми, то есть отката состояния файлов в рабочей директории до состояния в указанном коммите не произойдет (в отличие от опции --hard). То есть, сдвинется только указатель в истории, без изменения файлов в рабочей директории.
Иными словами, если вы обнаруживаете ошибку в только что совершенном коммите или комментарии к нему, то легко можно исправить ситуацию. Например:
git commit …
— произошел некорректный коммит;
git reset --soft HEAD^
— переходим к работе над этим уже совершенным коммитом, сохраняя все состояние проекта и проиндексированные файлы
edit WRONGFILE
edit ANOTHERWRONGFILE
add.
Команда:
git commit -c ORIG_HEAD
— вернутся к последнему коммиту. Будет предложено редактировать его сообщение. Если сообщение оставить прежним, то
достаточно изменить регистр ключа -с:
git commit -C ORIG_HEAD
Обратите внимание на обозначение HEAD^, оно означает «обратиться к предку последнего коммита». Подробней описан синтаксис такой относительной адресации будет ниже, в разделе «Хэши, тэги, относительная адресация». Соответственно, HEAD — ссылка на последний коммит. Ссылка ORIG_HEAD после «мягкого» резета указывает на оригинальный коммит.
Естественно, можно вернуться и на большую глубину коммитов.
«Жесткий» резет (ключ --hard) — команда, которую следует использовать с осторожностью. Git reset --hard вернет дерево проекта и индекс в состояние, соответствующее указанному коммиту, удалив изменения последующих коммитов:
git add.
git commit -m «destined to death»
git reset --hard HEAD~1
— больше никто и никогда не увидит этот позорный коммит.
git reset --hard HEAD~3
— вернее, три последних коммита. Никто. Никогда.
Если команда достигнет точки ветвления, удаления коммита не произойдет.
Для команд слияния или выкачивания последних изменений с удаленного репозитария примеры резета будут приведены в соответствующих разделах.