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

12 set 2022 2 min di lettura
Как отменить последнюю фиксацию с помощью Git в Linux
Indice dei contenuti

Введение

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

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

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

Архитектура 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~1
git 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

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

42912333 (HEAD -> master) Update changelog
 6505778c adding new tests
 650862ab new blog post
 85a63416 sort configuration file
 152032c4 Refactor User class...

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

git reset --hard 85a63416

Вывод

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

Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.