Перейти к содержимому

Revert commit что это

  • автор:

В чем разница между undo commit, revert commit и reset branch to commit?

60a768386e748939816495.png

В чем отличие?

  • Вопрос задан более двух лет назад
  • 12182 просмотра

1 комментарий

Простой 1 комментарий

sergey-kuznetsov

Сергей Кузнецов @sergey-kuznetsov Куратор тега Git
ivandao ответы не удовлетворили?
Решения вопроса 2

sergey-kuznetsov

Сергей Кузнецов @sergey-kuznetsov Куратор тега Git
Автоматизатор

Там в меню вашей IDE есть ещё несколько методов откатить изменения.
Это же JetBrains? Все способы подробно описаны в справке, например вот как в IntelliJ IDEA

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

Revert не удаляет коммит, а создаёт новый, который описывает действия необходимые для отмены выбранного коммита.

Undo позволяет отменить последний коммит. Но изменения коммита предлагает сохранить в новый changelist. Файлы в рабочем каталоге не изменятся и можно будет их подправить и заново закоммитить.

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

Revert Selected Changes напоминает Revert, но отменяет изменения отдельного файла, а не всего коммита. Эта команда доступна на Панели изменённых файлов.

Get позволяет вернуть любой файл к состоянию на определённый коммит в истории. Выберем файл любым удобным способом и контекстное меню Git | Show History покажет все коммиты, в которых изменялся данный файл. Кликнув на нужном коммите правой кнопкой увидим команду Get

A3.8 Приложение C: Команды Git — Внесение исправлений

Некоторые команды в Git основываются на подходе к рассмотрению коммитов в терминах внесённых ими изменений, т. е. рассматривают историю коммитов как цепочку патчей. Ниже перечислены эти команды.

git cherry-pick

Команда git cherry-pick берёт изменения, вносимые одним коммитом, и пытается повторно применить их в виде нового коммита в текущей ветке. Эта возможность полезна в ситуации, когда нужно забрать парочку коммитов из другой ветки, а не сливать ветку целиком со всеми внесёнными в неё изменениями.

Этот процесс описан и показан в разделе Схема с перебазированием и отбором главы 5.

git rebase

git rebase — это «автоматизированный» cherry-pick . Он выполняет ту же работу, но для цепочки коммитов, тем самым как бы перенося ветку на новое место.

Мы в деталях разобрались с механизмом переноса веток в разделе Перебазирование главы 3, включая рассмотрение потенциальных проблем переноса опубликованных веток при совместной работе.

Мы использовали эту команду на практике для разбиения истории на два репозитория в разделе Замена главы 7, наряду с использованием флага —onto .

В разделе Rerere главы 7 мы рассмотрели случай возникновения конфликта во время переноса коммитов.

Также мы познакомились с интерактивным вариантом git rebase , включающемся с помощью опции -i , в разделе Изменение сообщений нескольких коммитов главы 7.

git revert

Команда git revert — полная противоположность git cherry-pick . Она создаёт новый коммит, который вносит изменения, противоположные указанному коммиту, по существу отменяя его.

Мы использовали её в разделе Отмена коммита главы 7 чтобы отменить коммит слияния (merge commit).

git revert Откатить состояние репозитория к указанному коммиту — разные варианты, диапазон, список коммитов

vedro-compota's picture

git revert — откатывает коммит путём создания нового, изменения в котором обратны тому коммиту, который нужно отменить. Таким образом откат будет виден в истории как очередной коммит.

Примеры git revert — все файлы

git revert умеет отменять не только выбранный коммит, но поддерживает и более сложные варианты:

    Откатываем конкретные коммиты перечисляя их хэши через пробел (в предельном случае таким способом можно откатить 1 коммит), например, откатить список коммитов (вы можете получить их хэши в истории изменений):

git revert a867b4af 25eee4ca 0766c053
git revert HEAD~2..HEAD
git revert a867b4af..0766c053

Отмена коммитов — Введение в Git

Git — система, в которой не нужно бояться совершать ошибки. Можно сказать, что ошибки — это единственный способ научиться им пользоваться. В Git практически всегда есть способ восстановить или изменить любые коммиты. На крайний случай спасет повторный git clone .

Что делать, если коммит уже сделан, но он нас по каким-то причинам не устраивает? Ситуаций может быть много, и все они возникают регулярно даже у профессиональных разработчиков:

  • Забыли добавить в коммит нужные файлы
  • Изменения нужно «откатить», чтобы доработать
  • Изменения больше не актуальны, и их нужно удалить
  • Изменения были сделаны по ошибке, и их нужно отменить

По большей части Git движется «только вперед». Правильный подход при работе с ним — это создавать новое, а не изменять старое.

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

Несмотря на сказанное выше, внутри Git существуют специальные команды, позволяющие упростить отмену, либо изменение коммита. С их помощью можно сделать историю коммитов понятной, а сам процесс отката — быстрым. Эти команды мы изучим в этом уроке.

Git revert

Самая простая ситуация — отмена изменений. Фактически она сводится к созданию еще одного коммита, который выполняет изменения, противоположные тому коммиту, который отменяется:

Руками создавать подобный коммит довольно сложно, поэтому в Git добавили команду, автоматизирующую откат. Эта команда называется git revert :

# Этой команде нужен идентификатор коммита # Это коммит, которым мы удалили файл PEOPLE.md git revert aa600a43cb164408e4ad87d216bc679d097f1a6c # После этой команды откроется редактор, ожидающий ввода описания коммита # Обычно сообщение revert не меняют, поэтому достаточно просто закрыть редактор [main 65a8ef7] Revert "remove PEOPLE.md" 1 file changed, 1 insertion(+) create mode 100644 PEOPLE.md # В проект вернулся файл PEOPLE.md git log -p commit 65a8ef7fd56c7356dcee35c2d05b4400f4467ca8 Author: tirion Date: Sat Sep 26 15:32:46 2020 -0400 Revert "remove PEOPLE.md" This reverts commit aa600a43cb164408e4ad87d216bc679d097f1a6c. diff --git a/PEOPLE.md b/PEOPLE.md new file mode 100644 index 0000000..4b34ba8 --- /dev/null +++ b/PEOPLE.md @@ -0,0 +1 @@ +Haskell Curry 

Команда revert может отменять не только последний коммит, но и любой другой коммит из истории проекта. Согласитесь, это очень круто. Без системы контроля версий о таком нельзя было и мечтать.

Команда git reset

Представьте, что вам нужно удалить только что сделанный по ошибке коммит. Конечно, и в этом случае подходит git revert , но так история становится менее читаемой. Если этот коммит сделан был только сейчас и еще не отправлялся на GitHub, то лучше сделать так, как будто бы этого коммита не существовало в принципе.

Git позволяет удалять коммиты. Это опасная операция, которую нужно делать только в том случае, если речь идет про новые коммиты, которых нет ни у кого, кроме вас.

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

Для удаления коммита используется команда git reset :

# Добавляем новый коммит, который мы сразу же удалим echo 'test' >> INFO.md git add INFO.md git commit -m 'update INFO.md' [main 17a77cb] update INFO.md 1 file changed, 1 insertion(+) # Важно, что мы не делаем git push git reset --hard HEAD~ HEAD is now at 65a8ef7 Revert "remove PEOPLE.md" # Если посмотреть `git log`, то последнего коммита там больше нет 

У команды git reset есть множество различных флагов и способов работы. С ее помощью можно удалять коммиты, отменять их без удаления, восстанавливать файлы из истории и так далее. Работа с ней относится к продвинутому использованию Git, но здесь мы затрагиваем только самую базу.

Флаг —hard означает полное удаление. Без него git reset отменит коммит, но не удалит его, а поместит все изменения этого коммита в рабочую директорию, так что с ними можно будет продолжить работать.

Флаг HEAD~ означает «один коммит от последнего коммита». Если бы мы хотели удалить два последних коммита, то могли бы написать HEAD~2 :

HEAD (переводится как «голова») — так обозначается последний сделанный коммит. Подробнее эту терминологию мы разберем в уроке, посвященном внутреннему устройству Git.

Если не указывать флаг —hard , то по умолчанию подразумевается флаг —mixed . В таком варианте git reset отправляет изменения последнего коммита в рабочую директорию. Затем их можно исправить или отменить и выполнить новый коммит:

echo 'no code no pain' > README.md git add README.md git commit -m 'update README.md' [main f85e3a6] update README.md 1 file changed, 1 insertion(+) # Теперь откатываем последний коммит git reset HEAD~ Unstaged changes after reset: M README.md git status On branch main Your branch is up to date with 'origin/main'. Changes not staged for commit: (use "git add . " to update what will be committed) (use "git restore . " to discard changes in working directory) modified: README.md 

Последнего коммита больше не существует. При этом сделанные в нем изменения не пропали. Они находятся в рабочей директории для дальнейшей доработки.

Самостоятельная работа
  1. Выполните все шаги из урока
  2. Измените добавленный текст на No code No pain
  3. Закоммитьте изменения с сообщением update README.md
  4. Залейте изменения на GitHub

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *