¿Cómo volver a la última confirmación después de verificar una confirmación anterior?

477

A veces reviso alguna versión anterior del código para examinar o probar. He visto instrucciones sobre qué hacer si deseo modificar confirmaciones anteriores, pero supongamos que no hago cambios. Después de haber terminado git checkout HEAD^, por ejemplo , ¿cómo vuelvo a la punta de la rama? ... git logya no me muestra el SHA de la última confirmación.

Leo Alekseyev
fuente
11
Con respecto a la git logoración de su pregunta, siempre puede ejecutar git log --all(o más útilmente git log --oneline --graph --all).
Comodín el

Respuestas:

607

Si sabe que la confirmación a la que desea regresar es la cabeza de alguna rama, o está etiquetada, entonces puede simplemente

git checkout branchname

También puede usar git reflogpara ver qué otros compromisos ha señalado su HEAD (o cualquier otra referencia) en el pasado.


Editado para agregar:

En las versiones más recientes de Git, si solo corriste git checkouto alguna otra cosa para mover una HEADvez, también puedes hacer

git checkout -

para volver a donde estaba antes del último pago. Esto fue motivado por la analogía con el idioma de shell cd -para volver al directorio de trabajo en el que se encontraba anteriormente.

Phil Miller
fuente
27
Me gustaría mencionar que el ejemplo típico sería "git checkout master". Una de las dificultades que tuve para aprender a usar git fue no saber qué palabras clave específicas (por ejemplo, "maestro") puedo sustituir por palabras de marcador de posición como "nombre de sucursal".
AbePralle
3
masteren realidad no es ningún tipo de palabra clave, la forma HEADes. Es solo el nombre de rama predeterminado en un nuevo repositorio. Puede ejecutar git branchpara obtener una lista de ramas en su repositorio y git tag -lpara obtener una lista de etiquetas. Del mismo modo, origines el nombre predeterminado del control remoto desde el que se clona un repositorio, pero no tiene nada de especial.
Phil Miller
3
Si no estaba claro, git reflogle da una lista de hashes, en cuyo punto puede usar git checkout [commit-hash].
jbnunn
Eliminé un archivo e intenté el comando, pero no lo restablece por completo. En primer lugar, no es recursivo. Luego, cuando intento esto en el archivo que eliminé, git luego me dice que HEAD está desconectado. ¿Qué hacer?
Daniel S.
1
@DanielS .: La pregunta y mi respuesta fueron sobre commits , mientras usted habla de archivos. Git los trata de manera bastante diferente.
Phil Miller
27

git checkout master

master es la punta, o el último commit. gitk solo te mostrará dónde estás en el árbol en ese momento. git reflog mostrará todas las confirmaciones, pero en este caso, solo quieres la sugerencia, así que git checkout master.

Bruce Wells
fuente
1
Esta. Ogit checkout branchname
Alex
19

Encontré esta pregunta hace un momento y tengo algo que agregar

Para ir a la confirmación más reciente:

git checkout $(git log --branches -1 --pretty=format:"%H")

Explicación:

git log --branchesmuestra el registro de confirmaciones de todas las sucursales locales,
-1limita a una confirmación → el
--pretty=format:"%H"formato de confirmación más reciente para mostrar solo la
git checkout $(...)salida de uso de hash de confirmación de subshell como argumento para el pago

Nota:

Sin embargo, esto dará como resultado una cabeza separada (porque pagamos directamente al commit). Esto se puede evitar extrayendo el nombre de la rama utilizando sed, como se explica a continuación.


Para ir a la rama de la confirmación más reciente:

git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')

Explicación:

git log --branchesmuestra el registro de confirmaciones de todas las ramas locales,
-1limita a una confirmación → el
--pretty=format:"%D"formato de confirmación más reciente para mostrar solo los nombres de referencia
| sed 's/.*, //g'ignora todas menos las últimas referencias (*)
git checkout $(...)usa la salida de la subshell como argumento para el pago

*) HEAD y las ramas remotas se enumeran primero, las ramas locales se enumeran en último lugar en orden alfabético descendente, por lo que el restante será el primer nombre de la rama alfabéticamente

Nota:

Esto siempre usará el nombre de la primera rama (alfabéticamente) si hay múltiples para esa confirmación.


De todos modos, creo que la mejor solución sería mostrar los nombres de referencia para la confirmación más reciente para saber dónde realizar el pago:

git log --branches -1 --pretty=format:'%D'

Por ejemplo, cree el alias git toppara ese comando.

816-8055
fuente
1
De alguna manera engañé el segundo comando ... Lo arreglé, ahora lo verificará correctamente en la rama de la confirmación más reciente.
816-8055
Alias ​​Bash / zsh para que el comando regrese a la cabezaalias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Hi-Angel
9

Eche un vistazo a la GUI gráfica ... gitkmuestra todos los commits. A veces es más fácil trabajar gráficamente ... ^^

tanascio
fuente
sí, así es como lo hice en el pasado, pero no tengo la GUI disponible en este momento
Leo Alekseyev
7

Puede usar uno de los siguientes comandos git para esto:

git checkout master
git checkout branchname
hothead1000
fuente
4

muestra todas las ramas y confirma
git log --branches --oneline

muestra el último registro de confirmación de
git - ramas -1 --en línea

mostrar antes del último commit
git log --branches -2 --oneline

abdesselam
fuente
¿El primer comando realmente confirmará qué código está actualmente en escena, o lo estoy leyendo mal?
Lazerbeak12345
3
git reflog //find the hash of the commit that you want to checkout
git checkout <commit number>>
Atif Majeed
fuente
0

Si tiene una rama diferente a la maestra, una manera fácil es verificar esa rama y luego verificar la maestra. Voila, estás de vuelta en la punta del maestro. Probablemente hay formas más inteligentes ...

ConorR
fuente
0

Simplemente puedes hacer git pull origin branchname. Recuperará el último commit nuevamente.

Ankit Singh
fuente
No recomiendo esto si no desea extraer desde la parte superior. Uno debe manejar los conflictos de fusión solo cuando estén listos para hacerlo.
Lazerbeak12345
Bueno, en ese caso, la cabeza permanecerá en estado separado, incluso si realiza el pago en la última confirmación.
Ankit Singh
-2

Si su último commit está en la rama maestra, simplemente puede usar

git checkout master
Jackie Xu
fuente