Отмена коммита немного страшна, если вы не знаете, как он работает. Но на самом деле это удивительно легко, если вы понимаете.
Скажем, у вас это есть, где C - это ваша ГОЛОВА, а (F) - это состояние ваших файлов.
(F)
A-B-C
↑
master
Вы хотите обнулить коммит C и никогда больше его не видеть и потерять все изменения в локально измененных файлах . Ты делаешь это:
git reset --hard HEAD~1
Результат:
(F)
A-B
↑
master
Теперь Б - ГОЛОВА. Поскольку вы использовали --hard
, ваши файлы возвращаются в свое состояние при фиксации B.
Ах, но предположим, что commit C был не катастрофой, а всего лишь ошибкой. Вы хотите отменить коммит, но сохраните свои изменения для небольшого редактирования, прежде чем сделать лучший коммит. Начиная снова здесь, с C в качестве вашей головы:
(F)
A-B-C
↑
master
Вы можете сделать это, оставив --hard
:
git reset HEAD~1
В этом случае результат:
(F)
A-B-C
↑
master
В обоих случаях HEAD - это просто указатель на последний коммит. Когда вы делаете a git reset HEAD~1
, вы говорите Git переместить указатель HEAD на один коммит. Но (если вы не используете --hard
) вы оставляете свои файлы, как они были. Итак, теперь git status
показывает изменения, которые вы зарегистрировали в C. Вы ничего не потеряли!
Для легкого прикосновения вы можете даже отменить фиксацию, но оставить свои файлы и индекс :
git reset --soft HEAD~1
Это не только оставляет ваши файлы в покое, но даже оставляет ваш индекс в покое. Когда вы это сделаете git status
, вы увидите, что в индексе есть те же файлы, что и раньше. Фактически, сразу после этой команды вы могли бы выполнить git commit
и повторить тот же коммит, который только что сделал.
Еще одна вещь: предположим, вы уничтожили коммит, как в первом примере, но потом обнаружили, что он вам нужен в конце концов ? Не повезло, правда?
Нет, еще есть способ вернуть его. Тип git reflog
и вы увидите список (частично) совершать ШАС (то есть, хэш) , что вы переместились вокруг в Найти коммит вы уничтожили, и сделать это.:
git checkout -b someNewBranchName shaYouDestroyed
Вы сейчас воскресили этот коммит. Комитеты на самом деле не уничтожаются в Git в течение примерно 90 дней, поэтому обычно вы можете вернуться и спасти того, от кого не хотели избавиться.