Урок 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 не добавил новый коммит, а заменил последний: в истории его хеш изменился.
Мини-тест: проверьте себя
Закрепите урок: несколько вопросов, разбор ответов — в конце.
-
Вы испортили файл и хотите вернуть его к последнему коммиту. Какая команда?
git restore возвращает файл в состояние последнего коммита. Несохранённые правки в нём при этом пропадут — убедитесь, что они не нужны.
-
Вы случайно добавили в индекс лишний файл. Как убрать его оттуда, не теряя изменений?
restore --staged только убирает файл из индекса. Сам файл и правки в нём остаются в рабочей папке.
-
Чем git revert отличается от удаления коммита из истории?
История остаётся честной: видно и ошибку, и её отмену. Это безопасно, даже если коллеги уже забрали ваши коммиты.
-
Когда можно исправлять коммит через git commit --amend?
amend заменяет последний коммит новым. Если его уже забрали коллеги, у них останется старая версия, и истории разойдутся.