Как мне вернуть Git-репозиторий к предыдущему коммиту? - PullRequest
6929 голосов
/ 06 ноября 2010

Как мне вернуться из моего текущего состояния к снимку, сделанному на определенном коммите?

Если я сделаю git log, то получу следующий вывод:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

Каквернуться к фиксации с 3 ноября, т.е. совершить 0d1d7fc?

Ответы [ 41 ]

20 голосов
/ 28 июля 2015

Чтобы сохранить изменения предыдущего коммита в HEAD и перейти к предыдущему коммиту, выполните:

git reset <SHA>

Если не требуется вносить изменения из предыдущего коммита в HEAD и просто отменить все изменения, выполните:

git reset --hard <SHA>
20 голосов
/ 05 мая 2016

Это еще один способ прямого сброса на недавний коммит

git stash
git stash clear

Он непосредственно очищает все изменения, которые вы сделали с момента последнего коммита.

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

19 голосов
/ 05 февраля 2015

Я полагаю, что некоторые люди могут прийти к этому вопросу, желая узнать, как откатить совершенные изменения, которые они сделали в своем мастере - то есть выбросить все и вернуться к origin / master, в этом случае сделать это:

git reset --hard origin/master

https://superuser.com/questions/273172/how-to-reset-master-to-origin-master

16 голосов
/ 31 августа 2018

Возврат самого последнего коммита:

git reset --hard HEAD

HEAD - это просто ссылка на текущий коммит (последний) в текущей ветви.В каждый момент времени может быть только один HEAD.

Возврат к более старой фиксации. Самый быстрый способ восстановить старую версию - использовать команду reset:

# Resets index to former commit
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

# Updates working copy to reflect the new commit
git reset --hard

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

Команда сброса поставляется с парой опций, одна из наиболее интересных - флаг --soft.Если вы используете его вместо --hard, Git сохранит все изменения в этих «отмененных» коммитах как локальные модификации.

Восстановление ревизии в Новой локальной ветке

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

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

git checkout -b old-project-state 0ad5a7a6

Обычно команда checkout используется только для переключения веток.Однако, предоставив параметр -b, вы также можете позволить ему создать новую ветвь (с именем old-project-state в этом примере).Если вы не хотите, чтобы он начинался с текущей ревизии HEAD, вам также необходимо предоставить хеш коммита - старую ревизию проекта, которую мы хотим восстановить.

Теперь у вас есть новая ветка с именем old-project-state отражает старую версию вашего проекта - не касаясь и даже не удаляя другие коммиты или ветки.

16 голосов
/ 20 августа 2015

Revert - команда для отката коммитов.

git revert <commit1> <commit2> 

Пример:

git revert 2h3h23233

Он способен принимать дальность от ГОЛОВКИ, как показано ниже. Здесь 1 говорит «отменить последний коммит».

git revert HEAD~1..HEAD

, а затем сделать git push

13 голосов
/ 07 мая 2017

Попробуйте сбросить до желаемого коммита -

git reset <COMMIT_ID>

(для проверки COMMIT_ID используйте git log)

Это вернет все измененные файлы в состояние без добавления.

Теперь вы можете checkout все не добавленные файлы

git checkout .

Проверьте git log, чтобы подтвердить изменения.

UPDATE

Если в вашем репо один и единственный коммит, попробуйте

git update-ref -d HEAD

13 голосов
/ 19 марта 2015

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

  1. Скопируйте весь каталог и назовите его как-нибудь еще, например, "мой проект - копия"

  2. Do:

    git reset --hard [first-4-letters&numbers-of-commit's-SHA]
    

У вас в системе есть две версии ... вы можете просматривать, копировать или изменять файлы, представляющие интерес, или что-то еще из предыдущего коммита.Вы можете полностью отказаться от файлов в разделе «Мой проект - копия», если вы решили, что новая работа никуда не денется ...

Очевидная вещь, если вы хотите продолжить состояние проекта без фактическогоОтмена работы, поскольку этот извлеченный коммит состоит в том, чтобы снова переименовать ваш каталог: Удалить проект, содержащий извлеченный коммит (или дать ему временное имя), и переименовать ваш каталог «my project - copy» обратно в «my project».Тогда, вероятно, сделайте еще один коммит довольно скоро.

Git - блестящее создание, но вы не можете просто «забрать его на лету»: также люди, которые пытаются объяснить это слишком часто примите предварительные знания о других VCS [системах контроля версий] и слишком глубоко погрузитесь в них слишком рано и совершите другие преступления, например, используйте взаимозаменяемые термины для «проверки» - способами, которые иногда кажутся почти рассчитанными, чтобы запутать новичка.

Чтобы избавить себя от стресса, вам придется в значительной степени прочитать книгу о Git - я бы порекомендовал "Контроль версий с помощью Git" .И если вы можете доверять мне (или, скорее, моим шрамам), когда я говорю «должен», из этого следует, что вы могли бы сделать это СЕЙЧАС .Большая часть сложности Git происходит от ветвления и последующего повторного использования.Но из твоего вопроса нет никаких причин, почему люди должны ослеплять тебя наукой .

Особенно, если, например, это отчаянная ситуация, и вы новичок в Git!

PS: Еще одна мысль: (сейчас) на самом деле довольно просто сохранить Gitрепозиторий («репо») в каталоге, отличном от каталога с рабочими файлами.Это означает, что вам не нужно будет копировать весь репозиторий Git, используя вышеуказанное быстрое и грязное решение.Смотрите ответ Фрайера, используя --separate-git-dir здесь . Будьте предупреждены , однако: если у вас есть репозиторий «отдельный каталог», который вы не копируете, и вы выполняете полный сброс, все версии, следующие за фиксацией сброса, будут потеряны навсегда, если у вас нетКак вам и следует делать, регулярно создавайте резервные копии своего хранилища, желательно в облаке (например, Google Drive ) и других местах.

11 голосов
/ 20 марта 2017

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

Сначала вам нужно удалить проявление из источника:

git push origin :develop (note the colon)

Тогда вам нужно получить статус разработки, который вы хотите, позвольте мне предположить, что хеш коммита равен EFGHIJK:

git reset --hard EFGHIJK

Наконец, нажмите развиваться снова:

git push origin develop
11 голосов
/ 08 января 2018

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

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

Вот как я это сделал:

git reset --hard CommitId && git clean -f

Это вернется в локальный репозиторий, здесь после использования git push -f обновится удаленный репозиторий.

git push -f
10 голосов
/ 02 мая 2018

На GitKraken вы можете сделать это:

  1. Щелкните правой кнопкой мыши на коммите, который вы хотите сбросить, выберите: Сбросить на этот коммит / Hard :

enter image description here

Снова щелкните правой кнопкой мыши на коммите, выберите: Текущее имя ветви / Push :

enter image description here

Нажмите на Force Push :

enter image description here

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

...