Как я могу переключить свой репозиторий git на конкретный коммит

192

В моем git-репозитории я сделал 5 коммитов, как показано ниже в моем журнале git:

commit 4f8b120cdafecc5144d7cdae472c36ec80315fdc
Author: Michael 
Date:   Fri Feb 4 15:26:38 2011 -0800

commit b688d46f55db1bc304f7f689a065331fc1715079
Author: Michael
Date:   Mon Jan 31 10:37:42 2011 -0800

commit b364f9dcec3b0d52666c4f03eb5f6efb7e1e7bda
Author: Michael
Date:   Wed Jan 26 13:33:17 2011 -0800

commit 4771e26619b9acba3f059b491c6c6d70115e696c
Author: Michael 
Date:   Wed Jan 26 11:16:51 2011 -0800

commit 6e559cb951b9bfa14243b925c1972a1bd2586d59
Author: Michael 
Date:   Fri Jan 21 11:42:27 2011 -0800

Как я могу откатить мои предыдущие 4 коммитов локально в ветке? Другими словами, как я могу создать ветку без моих последних 4 коммитов (предположим, у меня есть SHA этого коммита из git log)?

Майкл
источник

Ответы:

234

Чтобы создать новую ветку (локально):

  • С хэшем коммита (или его частью)

    git checkout -b new_branch 6e559cb
    
  • или вернуться назад 4 коммитов из HEAD

    git checkout -b new_branch HEAD~4
    

Как только ваша новая ветвь создана (локально), вы можете реплицировать это изменение на удаленном устройстве с тем же именем: Как я могу перенести свои изменения в удаленную ветку


Для отбрасывания последних трех коммитов , см ответ Lunaryorn ниже действующей .


Для перемещения вашей текущей ветки HEAD в указанный коммит без создания новой ветки , смотрите ответ Арпиагара ниже .

Artefacto
источник
160

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

 git checkout <commit_hash>

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


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

Исправить Git оторванной головой?

arpiagar
источник
1
Это оторвало бы голову. Не удобно.
Игорь Ганапольский
даже если <commit_hash>находится в другой ветке, которая впереди?
Ciasto piekarz
Связанный вопрос просто говорит git checkout master, наряду с одним или двумя крайними случаями, которые могут относиться к определенным ситуациям.
i336_
66

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

git reset --hard HEAD^^^^

Кроме того, вы можете указать хеш коммита, в который вы хотите сбросить:

git reset --hard 6e559cb
lunaryorn
источник
4
Это оставляет шаг ветвления. Если он запускает именно то, что показано здесь, он навсегда потеряет эти верхние коммиты.
Джимми Куадра
3
Ну, не обязательно навсегда - можно получить SHA предыдущей головы git reflogи вернуть ее обратно - но это отбросит их, да.
Янтарная
1
Если коммиты сначала нажимаются, а затем сбрасываются, их можно снова извлечь, просто потянув.
Рик Смит
17

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

git checkout -b newbranch 6e559cb95
KingCrunch
источник
0

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

Это означает, что вы не создаете новую ветку и не переходите в отдельное состояние. Новый способ сделать это:

git switch --detach revison

radzimir
источник