При работе с git откатить изменения часто бывает необходимо. Поскольку ошибки совершаются постоянно и на разных этапах (до коммита, после и когда изменения уже отправлены на удаленный сервер) самая популярная система контроля версий для разработчиков предусматривает возможность легко отменять изменения.
В git есть три сущности:
- working tree — локальная среда в которой и ведется разработка
- staging (index) — этап, начинающийся после выполнения команды git add
- HEAD с порядковыми метками — закомиченные изменения
Как в git откатить изменения
Если в рабочей директории появились нежелательные изменения восстановить состояние можно выполнив
git checkout -- ИМЯ_ФАЙЛА
Это полезно если требуется в git откатить изменения в файле и или в нескольких файлах, которые еще не были добавлены в индекс и замоммичены.
Команда подтянет изменения из последнего сделанного коммита в репозиторий — содержимого HEAD. Локальные файлы заменятся.
При этом те, изменения, которые уже находятся в индексе ( которые добавили с git add) в нем останутся.
Если коммиты не нужны — самый простой способ привести состояние локальной системы в соответствие состоянию удаленной:
git fetch origin
git reset --hard origin/master
Все данные в индексе и коммиты сбрасываются, состояние восстанавливается из указанной ветки, в примере master.
Самая применяемая практика при откате изменений git
Можно не трогать индекс и локальные файлы, просто удалить коммиты.
git reflog
reflog выведет все список всех действий
git reset HEAD@{index}
reset возвращает состояние по индексу, взятому из списка
Таким же образом можно отменить последний коммит
git reset HEAD~1
После знака тильды можно указать любое другое число; ~1 означает, что отменяется последний коммит, ~3, что последние три и т.д. Список всех коммитов и комментариев можно увидеть выполнив git log
Другой способ сделать то же
git reset --soft HEAD^
Ключ --soft
означает, что данные удалены не будут, только коммит, если заменить его на --hard
удалятся и данные
Подробнее про git reset в документации.
В удаленном репозитории откатить изменения можно таким же образом — убрав последние коммиты, затем выполнив git push с локальной системы на которой ведется разработка.
Конфликты при внесении изменений в git репозитории неизбежны — если какое-то действие не возможно система не даст его выполнить и будет выводить предупреждения. Они обычно весьма информативны и конфликты в версиях разрешаются редактированием файлов вручную.
Также читайте про создание собственного git репозитория и git alias