Как в git откатить изменения до или после коммита


При работе с git откатить изменения часто бывает необходимо. Поскольку ошибки совершаются постоянно и на разных этапах (до коммита, после и когда изменения уже отправлены на удаленный сервер) самая популярная система контроля версий для разработчиков предусматривает возможность легко отменять изменения.



В git есть три сущности:


  1. working tree — локальная среда в которой и ведется разработка
  2. staging (index) — этап, начинающийся после выполнения команды git add
  3. HEAD с порядковыми метками — закомиченные изменения
git откатить изменения

Как в 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

Сказать спасибо