Урок 4 из 8 · 20 мин · обновлено

Отмена изменений: restore, amend и revert

Как вернуть файл к последнему сохранению, убрать лишнее из индекса, исправить последний коммит и безопасно отменить старый коммит.

Ошибаться в Git не страшно

Главное, ради чего нужен Git, — возможность откатиться. Но отменить можно разное: правки в файле, добавление в индекс, целый коммит. Для каждого случая своя команда. Разберём их от простого к сложному.

Вернуть файл к последнему коммиту

Вы поправили style.css, всё сломалось, и хочется вернуть как было:

Терминал
git restore style.css

Файл вернётся к состоянию последнего коммита. Внимание: несохранённые правки в нём пропадут навсегда — Git их не запоминал. Поэтому коммитьте почаще: то, что сохранено в истории, вернуть можно всегда.

Убрать файл из индекса

Вы сделали git add ., а в индекс попал лишний файл с заметками:

Терминал
git restore --staged notes.txt

Файл уйдёт из индекса и не попадёт в коммит, но сам он и правки в нём останутся. Подсказку с этой командой, кстати, печатает и git status.

Исправить последний коммит

Опечатались в сообщении или забыли добавить файл:

Терминал
git add forgotten.css
git commit --amend -m "Добавил стили главной страницы"

Последний коммит заменится новым: с исправленным сообщением и забытым файлом.

Важное ограничение: --amend используют, только пока коммит не отправлен на GitHub или общий сервер. Иначе у вас и у коллег окажутся разные версии истории — о том, как работать с сервером, урок 7.

Отменить старый коммит

Неделю назад вы добавили изменение, которое оказалось ошибкой. Найдите его хеш в git log --oneline и выполните:

Терминал
git revert --no-edit 3f2a1c9

Git создаст новый коммит, который делает обратное: удаляет добавленные строки и возвращает удалённые. Флаг --no-edit берёт готовое сообщение коммита. Без него Git откроет текстовый редактор, и если это незнакомый Vim, выйти из него можно так: набрать :wq и нажать Enter.

Результат
a71b3e0 Revert "Добавил баннер со скидкой"
8c4e2d1 Добавил стили главной страницы
3f2a1c9 Добавил баннер со скидкой

История не переписывается: в ней видны и ошибка, и её отмена. Поэтому revert безопасен даже для коммитов, которые уже есть у коллег.

Про git reset — с осторожностью

В инструкциях в интернете часто советуют git reset --hard. Эта команда возвращает весь проект к указанному коммиту и безвозвратно удаляет все несохранённые изменения. Она бывает нужна, но новичку легко потерять ею часть работы. Пока пользуйтесь restore и revert — их хватает почти для всех ситуаций.

Шпаргалка

Ситуация Команда
Испортил файл, хочу как в последнем коммите git restore файл
Добавил лишнее в индекс git restore --staged файл
Ошибся в последнем коммите, ещё не отправил git commit --amend
Нужно отменить коммит, который уже в истории git revert хеш

Попробуйте сами. Испортите index.html — например, удалите половину кода — и верните его через git restore. Затем сделайте коммит с опечаткой в сообщении и исправьте её через --amend.

Решение
Терминал
# испортили index.html
git status                 # файл помечен как изменённый
git restore index.html     # вернули как было
git status                 # изменений нет

# коммит с опечаткой
git add style.css
git commit -m "Испарвил цвет кнопки"
git commit --amend -m "Исправил цвет кнопки"
git log --oneline          # в истории — исправленное сообщение

--amend не добавил новый коммит, а заменил последний: в истории его хеш изменился.

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Вы испортили файл и хотите вернуть его к последнему коммиту. Какая команда?

  2. Вы случайно добавили в индекс лишний файл. Как убрать его оттуда, не теряя изменений?

  3. Чем git revert отличается от удаления коммита из истории?

  4. Когда можно исправлять коммит через git commit --amend?