Отмена изменений в GIT

mbaev 05.05.2017, 13:10

git-failСлучай, который происходит довольно редко, но метко - это "Ааааа, я накосячил в git!!!". У меня случилось такое сегодня, когда я сделал rebase со squash'ем локальной ветки, не имея этих коммитов в другой ветке. Git не задумываясь слил мои коммиты в один и перенёс его, а мне нужно было сохранить исходную ветку, создав новый squash-коммит.

В общем, здесь я вспомнил про логи и отмену изменений. Git умеет отменять практически любые изменения. Все связанное с передвижением HEAD'а можно отменить reset'ом. В моём случае отмена rebase делается следующим способом...

Смотрим последние изменения (безопасно):

  1. git reflog # для выхода жмем q
  2. # или смотреть последние 10 действий
  3. git reflog -n 10
  4. # или тоже самое, но короче
  5. git reflog -10

Например, мой вывод

 
git reflog -6

Дальше находим необходимую точку и откатываем код до её состояния. Здесь я вижу, что последние 5 чекпоинтов связаны с ребейзом. Я их пропускаю и двигаю HEAD назад на 6 изменений.

Здесь нужно понимать, что нельзя отменить какое-то одно, определённое действие совершённое ранее (если оно не последнее в истории). Можно лишь вернуться в фиксированную точку во времени, отменив все действия от текущего момента.

Флаг --hard будет означать, что добавленные изменения будут удалены.
Например, если вы откатываете коммит, в котором добавили файл, то после отката этот файл будет удалён из репозитория.Здесь можно использовать флаг --soft, который означает, что после отката коммита файл останется как не зафиксированные изменения.

  1. git reset --hard HEAD@{5}
  2. # для Windows могут понадобиться кавычки
  3. git reset --hard "HEAD@{5}"

Полезные ссылки