Отмена коммита немного страшна, если вы не знаете, как он работает. Но на самом деле это удивительно легко, если вы понимаете.
Допустим, у вас это есть, где 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 - это просто указатель на последний коммит. Когда вы делаете git reset HEAD~1
, вы говорите Git переместить указатель HEAD на один коммит. Но (если вы не используете --hard
) вы оставляете свои файлы такими, какими они были. Так что теперь git status
показывает изменения, которые вы зарегистрировали в C. Вы ничего не потеряли!
Для самого легкого прикосновения вы можете даже отменить свой коммит, но оставить свои файлы и index :
git reset --soft HEAD~1
Это не только оставляет ваши файлы в покое, оно даже оставляет ваш index в покое. Когда вы выполните git status
, вы увидите, что в индексе есть те же файлы, что и раньше. Фактически, сразу после этой команды вы могли бы выполнить git commit
и повторить тот же коммит, который вы только что сделали.
Еще одна вещь: Предположим, вы уничтожили коммит , как в первом примере, , но потом обнаружили, что он вам все-таки нужен ? Не повезло, правда?
Нет, еще есть способ вернуть его. Введите git reflog
, и вы увидите список (частичного) коммита шас (то есть хэшей), в который вы переместились. Найдите уничтоженный коммит и сделайте следующее:
git checkout -b someNewBranchName shaYouDestroyed
Вы сейчас воскресили этот коммит. На самом деле комитеты не уничтожаются в Git в течение примерно 90 дней, поэтому обычно вы можете вернуться и спасти того, от которого не хотели избавиться.