img

«Git, удали последний коммит!» Как отменить коммит в Git

Git – это довольно мощный инструмент, и, к тому же, он является самой популярной системой контроля версий. Это именно то, что позволяет разработчикам и техническим группам совместно работать над одними и теми же проектами. 

Но что делать, если вы случайно зафиксировали файл, который не должны были? Например, вы нашли в нем ошибку.

Не нужно беспокоиться! Git позволит исправить вам свои ошибки и вернуться к более ранней версии вашего проекта.   

У Git есть одна очень полезная функция – вы можете отменить изменения, которые внесли в проект.

В этой статье мы расскажем вам, как можно отменить изменения в Git в зависимости от состояния вашего Git-репозитория. 

Как отменить локальные невнесенные изменения в Git?

Допустим, что вы работаете на своем локальном компьютере. Вы внесли в локальный файл некоторые изменения и сохранили их. Чуть позже вы решили, что хотите их отменить. 

Если вы еще не успели внести изменения, то есть еще не применяли команду git add, то в таком случае вам поможет команда git restore.

Если более конкретно, то ваша команда git restore должна выглядеть примерно так:

git restore имя_файла

Итак, допустим, что у вас есть файл README.md, и вы случайно добавили в него какой-то текст и сохранили его там, но потом решили, что его нужно удалить. 

Для начала вы можете запустить команду git status, чтобы просмотреть состояние вашего Git-репозитория. 

Когда вы это сделаете, вы увидите, что файл не был помещен в архив, то есть команда git add еще не запускалась. После чего вы сможете просмотреть те файлы, которые, возможно, захотите удалить:

On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

Вот так выглядит команда для того, чтобы отменить изменения в файле README.md:

git restore README.md

Теперь вы можете еще раз запустить команду git status, чтобы снова проверить состояние вашего Git-репозитория:

On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

Ура! Вы успешно отменили свои последние изменения и вернулись к последней зафиксированной версии вашего проекта. 

Как отменить локальные внесенные изменения в Git?

Если вы все-таки запустили команду git add, то это значит, что вы внесли файл в свой архив. 

Итак, допустим, вы внесли локально некоторые изменения в файл README.md, после чего вы запустили команду git add, которая внесла ваши изменения в архив. Однако через какое-то время вы вдруг поняли, что в тексте есть ошибки.

Для начала запустите команду git status, чтобы убедиться, что вы внесли файл в архив, то есть запустили команду git add:

On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
modified:   README.md

Глядя на вывод команды git status, мы видим, что для того, чтобы отменить ваши изменения, нужно запустить следующую команду:

git restore --staged имя_файла

Эта команда удалит файл из архива, но при этом ваши изменения никуда не исчезнут.

А теперь давайте снова запустим git status:

On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

Ну и теперь, чтобы отменить внесенные изменения и восстановить содержимое файла до его исходного состояния, запустите вот эту команду:

git restore README.md 

И давайте еще раз запустим git status:

On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

И вот, изменения, которые вы внесли, исчезли, а файл вернулся к своей текущей зафиксированной версии.

Как отменить локальные зафиксированные изменения в Git?

Допустим, что вы внесли в файл некоторые изменения, разместили его с помощью команды git add и зафиксировали его с помощью другой команды git commit.

Это значит, что ваш коммит на данном этапе существует только локально и пока еще не был добавлен в удаленный репозиторий. 

Для начала запустите команду git status, чтобы убедиться в том, что вы зафиксировали файл:

On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

После чего, если вы хотите отменить последний локальный коммит, то просто запустите команду git log.

Последний коммит будет выглядеть следующим образом: его хэш (длинная последовательность из цифр и символов) и (HEAD -> main) в конце. Это коммит, который вы хотите отменить. 

Предпоследний коммит будет выглядеть так: его хэш и (origin/main) в конце. Это коммит, который вы хотите оставить и который вы отправили в удаленный репозиторий. 

Далее для того, чтобы отменить коммит, запустите следующую команду:

git reset --soft HEAD~

А теперь, снова запустите git log.

Вы должны увидеть хэш коммита и (HEAD -> main) в конце.

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

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

Давайте еще раз запустим git status:

On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
modified:   README.md

Отметим, что несмотря на то, что команда git reset --soft HEAD~ отменила ваш последний коммит, все изменения, которые были вами сделаны, сохранились.

Как отменить общедоступные зафиксированные изменения в Git?

Допустим, вы внесли в файл некоторые изменения, подготовили его с помощью команды git add, зафиксировали с помощью команды git commit и отправили в удаленный репозиторий с помощью команды git push. Однако через какое-то время вы поняли, что вам не нужно было фиксировать этот файл. 

Что делать в такой ситуации?

Для начала запустите команду git status, чтобы проверить состояние Git-репозитория:

On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

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

Для того, чтобы увидеть более короткую версию хэша, запустите следующую команду:

git log --oneline

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

Допустим, что хэш вашего последнего коммита выглядит так: cc3bbf7, за ним следует (HEAD -> main, origin/main) и сообщение вида «commit README.md file».

Для того, чтобы отменить конкретно этот коммит, запустите команду:

git revert cc3bbf7 --no-edit

Она создаст новый коммит и вернет этот файл в его предыдущее состояние (как будто его никогда не меняли), и тем самым отменит изменения. 

И наконец, для того, чтобы отправить изменение в удаленную ветку, вам нужно запустить команду git push.

После того, как вы выполните все эти действия, вы увидите, что сообщение в принципе останется таким же, но перед ним будет написано слово revert, например, «Revert commit README.md file».

Отметим также тот факт, что оба коммита будут отражены в истории, причем по отдельности:

Revert "commit README.md file"
@john-doe
john-doe committed 9 minutes ago

commit README.md file
@john-doe
john-doe committed 16 minutes ago 

Заключение

И вот оно – теперь вы знаете, как можно отменить изменения в Git!

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
DevOps
Скидка 25%
DevOps-инженер с нуля
Научитесь использовать инструменты и методы DevOps для автоматизации тестирования, сборки и развертывания кода, управления инфраструктурой и ускорения процесса доставки продуктов в продакшн. Станьте желанным специалистом в IT-индустрии и претендуйте на работу с высокой заработной платой.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
Git Flow - это специальная система ветвления для Git. Она помогает команде лучше контролировать и добавлять различные версии про
img
Docker — популярная платформа виртуализации на уровне ОС. Она поставляет приложения в пакетах (контейнерах), которые, представля
img
Хуки в Git — это bash-скрипты, которые запускаются до или после команд Git, например, коммитов и пушей. Они позволяют автоматизи
img
  Nomad и Kubernetes – это две самые популярные платформы оркестровки, предназначенные для оркестровки динамических рабочих нагр
img
  Давайте узнаем о новом Ops-течении – GitOps! DevOps поспособствовал цифровизации многих компаний. Речь идет о командах разрабо
img
  Канареечное (canary) развёртывание – это метод разработки и развертывания программного обеспечения, который позволяет выпускат
ЗИМНИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59