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

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



Как известно в git-е существует три сущности:

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

git откатить изменения

Если в рабочей директории были внесены нежелательные изменения восстановить состояние можно выполнив

git checkout — ИМЯ_ФАЙЛА

* два тире подряд после 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 push с локальной системы на которой ведется разработка.



Конфликты при внесении изменений в git репозитории неизбежны — если какое-то действие не возможно система не даст его выполнить и будет выводить предупреждения. Они обычно весьма информативны и конфиликты в версиях разрешаются редактированием файлов вручную.

Также читайте про создание собственного git репозитория