Ответ 1
git reset
знает пять "режимов": мягкий, смешанный, жесткий, объединить и сохранить. Я начну с первых трех, так как с этими режимами вы обычно сталкиваетесь. После этого вы найдете небольшой бонус, так что следите за обновлениями.
мягкий
При использовании git reset --soft HEAD~1
вы git reset --soft HEAD~1
последний коммит, но изменения файла останутся в вашем рабочем дереве. Также изменения останутся в вашем индексе, поэтому выполнение git commit
создаст коммит с теми же изменениями, что и ранее удаленный.
смешанный
Это режим по умолчанию и очень похож на мягкий. При "удалении" коммита с помощью git reset HEAD~1
вы все равно сохраните изменения в рабочем дереве, но не в индексе; так что если вы хотите "повторить" фиксацию, вам нужно будет добавить изменения (git add
) перед фиксацией.
жесткий
При использовании git reset --hard HEAD~1
вы потеряете все незафиксированные изменения в дополнение к изменениям, внесенным в последний коммит. Изменения не останутся в вашем рабочем дереве, поэтому выполнение команды git status
скажет вам, что в вашем хранилище нет никаких изменений.
Проходите осторожно с этим. Если вы случайно удалили незафиксированные изменения, которые никогда не были зафиксированы, вы не сможете вернуть их с помощью git
.
бонус
держать
git reset --keep HEAD~1
интересный и полезный. Он только сбрасывает файлы, которые отличаются между текущим HEAD
и данным коммитом. Он отменяет сброс, если кто-либо из этих файлов имеет незафиксированные изменения. Это в основном действует как более безопасная версия hard
.
Этот режим особенно полезен, когда у вас есть куча изменений и вы хотите переключиться на другую ветку без потери этих изменений - например, когда вы начали работать с неправильной веткой.
Вы можете прочитать больше об этом в документации по git reset.
Заметка
Когда выполняется git reset
для удаления коммита, коммит на самом деле не теряется, просто нет ссылки, указывающей на него или любого из его потомков. Вы все еще можете восстановить коммит, который был "удален" с помощью git reset
, найдя его ключ SHA-1, например, с помощью команды, такой как git reflog
.