¿Cómo puedo cambiar mi repositorio git a un commit particular?

191

En mi repositorio de git, hice 5 commits, como a continuación en mi registro de 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

¿Cómo puedo revertir mis 4 confirmaciones anteriores localmente en una sucursal? En otras palabras, ¿cómo puedo crear una rama sin mis últimos 4 commits (supongo que tengo el SHA de ese commit del git log)?

Miguel
fuente

Respuestas:

233

Para crear una nueva sucursal (localmente):

  • Con el hash commit (o parte de él)

    git checkout -b new_branch 6e559cb
    
  • o para retroceder 4 commits de HEAD

    git checkout -b new_branch HEAD~4
    

Una vez que se crea su nueva sucursal (localmente), es posible que desee replicar este cambio en un control remoto del mismo nombre: ¿Cómo puedo enviar mis cambios a una sucursal remota?


Para descartar los últimos tres commits , vea la respuesta de Lunaryorn a continuación .


Para mover su rama HEAD actual a la confirmación especificada sin crear una nueva rama , consulte la respuesta de Arpiagar a continuación .

Artefacto
fuente
160

Todos los comandos anteriores crean una nueva rama y la última confirmación es la especificada en el comando, pero en caso de que desee que su rama actual se HEADmueva a la confirmación especificada, a continuación se muestra el comando:

 git checkout <commit_hash>

Se separa y señala la HEADconfirmación especificada y se guarda de la creación de una nueva rama cuando el usuario solo quiere ver el estado de la rama hasta esa confirmación en particular.


Es posible que desee volver a la última confirmación y corregir el HEAD separado:

¿Arreglar una cabeza separada de Git?

arpiagar
fuente
1
Esto separaría la cabeza. No conveniente.
IgorGanapolsky
incluso si el <commit_hash>está en una rama diferente que está por delante?
Ciasto piekarz
La pregunta vinculada solo dice git checkout master, junto con uno o dos casos extremos que pueden aplicarse a ciertas situaciones.
i336_
66

Si quieres tirar los últimos cuatro commits, usa:

git reset --hard HEAD^^^^

Alternativamente, puede especificar el hash de una confirmación a la que desea restablecer:

git reset --hard 6e559cb
Lunaryorn
fuente
44
Esto deja de lado el paso de ramificación. Si ejecuta exactamente lo que se muestra aquí, perderá permanentemente esos compromisos principales.
Jimmy Cuadra
3
Bueno, no necesariamente de forma permanente, uno podría obtener el SHA de la cabeza anterior git reflogy restablecerlo, pero sería tirarlos a la basura, sí.
Ámbar
1
Si las confirmaciones se presionan primero y luego se restablecen, se pueden recuperar nuevamente con solo un tirón.
Rick Smith
17

Simplemente compruebe la confirmación desde la que desea que comience su nueva sucursal y cree una nueva sucursal

git checkout -b newbranch 6e559cb95
KingCrunch
fuente
0

¿Cómo puedo revertir mis 4 confirmaciones anteriores localmente en una sucursal?

Lo que significa que no estás creando una nueva rama y entrando en estado separado. La nueva forma de hacerlo es:

git switch --detach revison

radzimir
fuente