При работе с git откатить изменения часто бывает необходимо. Поскольку ошибки совершаются постоянно и на разных этапах (до коммита, после и когда изменения уже отправлены на удаленный сервер) самая популярная система контроля версий для разработчиков предусмативает возможность легко отменять изменения.
Как известно в git-е существует три сущности:
- working tree — локальная среда в которой и ведется разработка
- staging (index) — этап, начинающийся после того как выполнена команда git add
- HEAD с порядковыми метками — закомиченные изменения

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