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

Как вернуться к старому коммиту

  • автор:

#3 — Отмена действий. Возвращение к старым версиям

#3 - Отмена действий. Возвращение к старым версиям

Git позволяет просматривать хронологию изменений в вашем проекте. В ходе урока вы познакомитесь с отменой действий (коммитов) в Git, а также научитесь удалять коммиты и возвращать проект «назад во времени».

Видеоурок

В Git есть замечательная возможность «возвращения во времени»:

  • вы можете просмотреть как выглядел ваш проект на стадии определенного коммита;
  • вы можете отменить определенный коммит;
  • вы можете выполнить удаление коммита и возвращение к проекту на стадии определенного коммита.

Просмотр проекта

Чтобы просмотреть проект на стадии какого-либо коммита вам необходимо прописать команду git checkout id , где id это идентификатор коммита, который хотите просмотреть.

Чтобы узнать id изначально пропишите команду git log —oneline . Тогда вы получите список всех коммитов что были сделаны в вашем проекте, а также их идентификаторы.

Чтобы просмотреть какой-либо коммит выполните комманду: git checkout 102e2f1 . Здесь вы просмотрите проект на стадии первого коммита.

Отмена коммита

Для отмены коммита используйте команду git revert id , где id это идентификатор коммита, который хотите просмотреть. После выполнения команды вы отмените определенный коммит.

Удаление коммита

Для удаления коммита используйте команду git reset id —hard , где id это идентификатор коммита, который хотите просмотреть. После выполнения команды вы удалите определенный коммит и все данные будут возвращены к проекту что был на стадии коммита.

Задание к уроку

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

Большое задание по курсу

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

Git: вернуться к предыдущему коммиту

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

В этой статье я покажу несколько способов отменить ваши коммиты, в зависимости от вашего варианта использования. Это сложная тема (которая относится ко многим темам Git в целом), поэтому убедитесь, что вы следуете инструкциям, которые лучше всего соответствуют вашим потребностям.

Удалить неопубликованные коммиты

Если вы еще не опубликовали свои коммиты в удаленном репозитории, таком как GitHub, вы можете по существу удалить предыдущие коммиты с помощью команды reset.

Хотя это эффективное решение, оно опасное, поскольку вы переписываете историю и оставляете «удаленные» коммиты без ссылок или «осиротевшими». Единственный способ найти и восстановить эти несвязанные коммиты — это git reflog.

Команда reset имеет три различных параметра, два из которых мы опишем здесь:

$ git reset —hard

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

Это означает, что с помощью этой команды вы не только вернетесь к предыдущей фиксации, но и потеряете все рабочие изменения в процессе. Чтобы не потерять какие-либо рабочие изменения, вы можете использовать команды stash и stash pop:

$ git stash $ git reset --hard $ git stash pop

Команда stash сохраняет ваши рабочие изменения (без каких-либо комитов или изменений в дереве), а затем stash pop возвращает их обратно.

Другим вариантом, который вы можете рассмотреть, является параметр —soft. Эта опция работает так же, как git reset —hard , но влияет только на историю коммитов, а не на ваш рабочий каталог или промежуточный индекс.

$ git reset —soft

Удаление опубликованных коммитов

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

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

$ git revert

Допустим, в вашем репозитории есть текстовый файл со следующим содержанием

This is my sample text

И вы изменяете его на:

This is my awesome sample text

Ваша история коммитов может выглядеть примерно так:

$ git log --pretty=oneline 676ec97a9cb2cebbb5c77904bbc61ced05b86f52 Added 'awesome' to text 735c5b43bf4b5b7107a9cc3f6614a3890e2889f6 Initial commit

Если мы решили, что нам больше ненужно слово «awesome» в нашем тексте, но мы не хотим удалять коммит 676ec, мы можем использовать revert, чтобы отменить это изменение:

$ git revert 676ec [master f68e546] Revert "Added 'awesome' to text" 1 file changed, 1 insertion(+), 1 deletion(-)

Получив приглашение ввести сообщение о коммите, мы теперь можем видеть в нашей истории коммитов, что фактически существует новый коммит:

$ git log --pretty=oneline f68e546ac2ae240f22b2676b5aec499aab27f1ca Revert "Added 'awesome' to text" 676ec97a9cb2cebbb5c77904bbc61ced05b86f52 Added 'awesome' to text 735c5b43bf4b5b7107a9cc3f6614a3890e2889f6 Initial commit

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

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

git revert HEAD~2

Или, если вы хотите отменить много непостоянных коммитов, вы указываете их индивидуально:

git revert 676ec 735c5

Временно оформить предыдущий коммит

«Отмена фиксации» означает, что вы временно хотите вернуться к предыдущему состоянию в своем репозитории, но без внесения каких-либо реальных изменений в дерево. В этом случае вы, вероятно, просто захотите проверить фиксацию, что позволит вам вернуться к мастеру или любому другому состоянию, когда вы закончите:

$ git checkout

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

Отмена коммитов — Введение в 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

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

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

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

Как можно откатить изменения к последнему коммиту (вернуть репозиторий Git к предыдущему коммиту)

flat image where car devolves to a horse

Git имеет огромное количество инструментов по исправлению ошибок, возникающих во время работы. Для возврата репозитория к состоянию предыдущего коммита («откатить» последние изменения) или удаления коммитов, можно воспользоваться командой git-revert. Эта команда создает новый коммит (называемый обратным), отменяющий изменения, внесенные в старом коммите.

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

git revert HEAD

В процессе выполнения команды откроется редактор, в котором можно будет отредактировать описание нового коммита.

Проверь себя

Бесплатные тесты по HTML, CSS, JS и GIT

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

git revert 0dd263

Если нужно обратить (сделать revert) несколько коммитов, можно указать GIT промежуток истории, например:

git revert 0dd263..HEAD

В процессе выполнения этой команды будут сделаны обратные коммиты, начиная с коммита 0dd263, не включая его и до крайнего (на который указывает HEAD). Например, если в этот промежуток попало два коммита, будут сделаны два обратных коммита, поочередно отменяющие изменения каждого из исходных. Как и в предыдущих случаях, для каждого из коммитов будет открыт редактор, в котором можно будет изменить текст коммита (commit message).

Команда git revert имеет набор опций, расширяющих ее возможности, например —no-commit или если кратко, то -n. Эта опция останавливает GIT на этапе добавления изменения в индекс, после чего автор может сделать коммит самостоятельно. Это может быть полезным в случае, если делается revert нескольких коммитов и мы хотим поместить весь фикс в один обратный коммит, а не в несколько. То есть переписав предыдущий пример следующим образом, будет создан один обратный коммит, а не 2:

git revert --no-commit 0dd263..HEAD git commit -m "revert last 2 features"

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

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

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