Как отменить последнюю фиксацию Git

Иногда при работе с Git вам может потребоваться отменить последнюю фиксацию. Коммит — это моментальный снимок репозитория Git в определенный момент времени. В Git есть ссылочная переменная HEAD которая указывает на последнюю фиксацию в текущей рабочей ветке. Чтобы отменить фиксацию, все, что вам нужно сделать, это указать переменной HEAD на предыдущий снимок.

В этом руководстве объясняется, как отменить последнюю фиксацию Git.

Не рекомендуется отменять фиксацию, уже помещенную в общий репозиторий. Если вы хотите изменить только сообщение о фиксации, ознакомьтесь с этой статьей .

Архитектура Git с тремя деревьями

В Git вы можете отменить изменения, используя команду git reset за которой следует идентификатор фиксации.

git reset принимает дополнительные аргументы, которые позволяют вам управлять поведением команды. Чтобы лучше понять, как работает reset давайте поговорим о трех разных деревьях Git. Архитектура с тремя деревьями — ключевая концепция системы управления Git. Они называются деревьями, потому что представляют собой наборы файлов.

Git управляет следующими тремя деревьями:

  • Рабочий каталог — каталог, включающий все подкаталоги и файлы в локальной файловой системе, связанной с репозиторием. Его часто называют «рабочим деревом». Рабочий каталог — это что-то вроде песочницы, где вы можете протестировать изменения перед их фиксацией в промежуточном индексе.
  • Индекс — это дерево отслеживает новые или измененные файлы, которые были добавлены в индекс с помощью git add , для включения в следующую фиксацию. Его часто называют «промежуточной областью» или «промежуточным индексом».
  • HEAD — указатель на вашу последнюю фиксацию в текущей ветке.

Команда git reset имеет три аргумента, которые соответствуют трем деревьям:

  • --soft — обновляет указатель HEAD для данной фиксации. Рабочий каталог и Индекс не меняются.
  • --mixed — обновляет указатель HEAD и сбрасывает индекс до указанной фиксации. Рабочий каталог остается нетронутым. Это режим работы по умолчанию для команды reset .
  • --hard — обновляет указатель HEAD и сбрасывает индекс и рабочий каталог до указанной фиксации. Будьте особенно осторожны при использовании этой опции, так как все локальные изменения, которые вы не зафиксировали, будут перезаписаны и потеряны.

Отмена последней фиксации

Чтобы отменить последнюю фиксацию без потери изменений, внесенных вами в локальные файлы и индекс, вызовите git reset с параметром --soft за которым следует HEAD~1 :

git reset --soft HEAD~1

HEAD~1 — это переменная, указывающая на предыдущую фиксацию. Приведенная выше команда перемещает текущую ветвь назад на одну фиксацию, эффективно отменяя последнюю фиксацию. Если вы запустите команду git status , вы увидите, что измененные файлы перечислены как незафиксированные изменения.

Чтобы обновить указатель HEAD для сброса индекса, запустите git reset с --mixed или без параметра:

git reset --mixed HEAD~1git reset HEAD~1

Измененные файлы сохраняются, но, в отличие от предыдущего примера, теперь изменения не ставятся для фиксации.

Если вы не хотите сохранять изменения, внесенные в файлы, вызовите команду git reset с параметром --hard :

git reset --hard HEAD~1

Перед выполнением аппаратного сброса убедитесь, что вам больше не нужны изменения.

Отмена нескольких коммитов

С помощью git reset вы можете вернуться к любой предыдущей фиксации.

Например, чтобы переместить текущую ветку на три коммита назад, вы должны использовать:

git reset --hard HEAD~3

Поскольку мы используем --hard , приведенная выше команда удалит последние три снимка из истории коммитов.

Другой способ вернуться к конкретной фиксации — передать идентификатор фиксации команде git reset .

Используйте git log --oneline чтобы найти идентификаторы фиксации:

git log --oneline

Команда отобразит список всех коммитов, включая идентификатор и первую строку сообщения о фиксации:

32921222 (HEAD -> master) Update changelog
7505724c adding new tests
750862ce new blog post
95a63417 sort configuration file
252032e4 Refactor User class
...

Как только вы узнаете идентификатор коммита, на который хотите выполнить сброс, просто передайте его в команду git reset :

git reset --hard 95a63417

Выводы

Чтобы отменить последнюю фиксацию, используйте команду git reset . Не сбрасывайте отправленные коммиты, так как это может вызвать множество проблем для ваших коллег.

Если вы столкнулись с проблемой или хотите оставить отзыв, оставьте комментарий ниже.

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