Como alternar meu repositório git para um commit específico

189

No meu repositório git, fiz 5 confirmações, como abaixo no meu log do 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

Como reverter meus 4 commits anteriores localmente em uma ramificação? Em outras palavras, como posso criar uma ramificação sem minhas 4 confirmações mais recentes (suponha que eu tenha o SHA dessa confirmação do git log)?

Michael
fonte

Respostas:

230

Para criar uma nova ramificação (localmente):

  • Com o hash de confirmação (ou parte dele)

    git checkout -b new_branch 6e559cb
    
  • ou voltar 4 commits de HEAD

    git checkout -b new_branch HEAD~4
    

Depois que sua nova ramificação for criada (localmente), convém replicar essa alteração em um controle remoto com o mesmo nome: Como posso enviar minhas alterações para uma ramificação remota


Para descartar os três últimos commits , consulte a resposta de Lunaryorn abaixo .


Para mover seu ramo atual HEAD para o commit especificado sem criar um novo ramo , consulte a resposta de Arpiagar abaixo .

Artefacto
fonte
153

Todos os comandos acima criam uma nova ramificação e, com a confirmação mais recente, a especificada no comando, mas caso você deseje que sua ramificação atual HEADseja movida para a confirmação especificada, abaixo está o comando:

 git checkout <commit_hash>

Ele desanexa e aponta a HEADconfirmação especificada e evita a criação de uma nova ramificação quando o usuário deseja apenas exibir o estado da ramificação até a confirmação específica.


Você pode querer voltar para a confirmação mais recente e corrigir o HEAD desanexado:

Corrigir uma cabeça separada do Git?

arpiagar
fonte
1
Isso destacaria a cabeça. Não é conveniente.
IgorGanapolsky
mesmo se o <commit_hash>estiver no ramo diferente, que está à frente?
Ciasto piekarz
A questão vinculada diz apenas git checkout master, juntamente com um ou dois casos extremos que podem se aplicar a determinadas situações.
i336_ 26/06/19
66

Se você quiser jogar fora as quatro confirmações mais recentes, use:

git reset --hard HEAD^^^^

Como alternativa, você pode especificar o hash de uma confirmação para a qual deseja redefinir:

git reset --hard 6e559cb
lunaryorn
fonte
4
Isso deixa de fora a etapa de ramificação. Se ele executar exatamente o que é mostrado aqui, ele perderá permanentemente os principais commits.
Jimmy Cuadra
3
Bem, não necessariamente de forma permanente - é possível obter o SHA da cabeça anterior git refloge redefinir de volta para ela - mas seria jogá-los fora, sim.
âmbar
1
Se as confirmações forem pressionadas primeiro e depois redefinidas, elas poderão ser recuperadas novamente com apenas um puxão.
Rick Smith
17

Basta fazer o checkout do commit do qual você deseja que seu novo ramo comece e criar um novo ramo

git checkout -b newbranch 6e559cb95
KingCrunch
fonte