¿Hay alguna forma de hacer git checkout en la rama anterior?

703

Como que quiero el equivalente de cd -git. Si estoy en una sucursal mastery finalizo la compra foo, me encantaría poder escribir algo como git checkout -volver mastery poder escribirlo nuevamente para volver foo.

¿Existe algo como esto? ¿Sería difícil de implementar?

Matt Briggs
fuente
2
Me gustaría escribir la flecha ARRIBA para encontrar mi comando de pago git anterior: p
Kit Ho
11
eso implica mover las manos fuera de la posición inicial, escribir gc- es MUCHO más rápido que presionar hacia arriba hasta encontrar lo que está buscando
Matt Briggs
@MattBriggs realmente escribe gc-o fue esa abreviatura paragit checkout -
jewbix.cube
2
@ jewbix.cube Debes aprender sobre los alias, tanto para tu shell como para git.
Gauthier
@ KitHo: Me encuentro con ganas de hacerlo constantemente, pero el comando que quiero puede que ni siquiera exista en la historia si, por ejemplo, acabo de crear la rama.
M_M

Respuestas:

1227

De las notas de la versión 1.6.2

@{-1}es una forma de referirse a la última rama en la que estuvo. Esto se
acepta no solo donde se espera un nombre de objeto, sino en cualquier lugar donde se espera un nombre de rama y actúa como si escribiera el nombre de la rama.
Por ejemplo git branch --track mybranch @{-1}, git merge @{-1}y
git rev-parse --symbolic-full-name @{-1}funcionaría como se esperaba.

y

git checkout -es una abreviatura de git checkout @{-1}.

Karl Bielefeldt
fuente
46
wow, ¡debería haberlo intentado! pensé - era un shell-ism, y que si la funcionalidad estuviera en git, sería algo diferente
Matt Briggs
99
Esto no funciona bien cuando realice el pago de una confirmación SHA dos veces, en cuyo caso @ {- 1} puntos a donde estaba antes del primer pago y envío ..
user716468
1
Estoy usando ZSH, y tuve que ajustar @ {- 1} entre comillas. De lo contrario, git se atragantó:error: pathspec '@-' did not match any file(s) known to git. error: pathspec '@1' did not match any file(s) known to git.
Murphy Randle
14
Esta es probablemente la primera vez que una respuesta SO me hace sonreír sin control. ¡Pensé que esto sería mucho más difícil!
Owen
25
Felicitaciones adicionales por la pedagogía utilizada: muestre la facilidad general, luego mencione la taquigrafía compacta pero menos general. … A menudo uso @{u}, que es la rama aguas arriba de la rama actual. Es muy útil, por ejemplo, para git log @{u}..qué listas de confirmaciones anteriores no se han extraído todavía. Y lo contrario, git log ..@{u}que son solo los compromisos locales que aún no se han presionado.
Benjohn el
208

La forma más sencilla de hacer esto hoy en día es:

git checkout -

... que es un alias de:

git checkout @{-1}

git checkout menos

Si quieres saber más sobre esto, escribí un artículo completo al respecto aquí: Mira la rama anterior en Git .

marcgg
fuente
3
Perfecto. Estaba buscando cuál era la mejor manera de hacer esto para poder crear este alias exacto. Me alegra ver que simplemente existe.
Tabitha
3
¿Hay alguna manera de enumerar las ramas anteriores sin verificarlas?
Erotémico
77
@Erotemic usando bash -for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done
Bonsaigin
Increíble ver el 'git checkout -' ¡el alias es una cosa! Ese es exactamente el UX que estaba buscando :)
James Tayler
@Erotemic en powershell sería git reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] } . En bash tienes que escribir algo equivalente (obtener reflog y filtrarlo a líneas que contengan la cadena ": checkout:" y luego extraer el nombre de la rama). Esto es realmente lo que hace git
Mariusz Pawelski, el
28

Como @Karl señala y del git checkoutmanual:

Como caso especial, la sintaxis "@ {- N}" para la N-ésima última rama desprotege la rama (en lugar de separarla). También puede especificar, que es sinónimo de "@ {- 1}".

Por lo tanto git checkout -, y git checkout @{-1}funcionaría en este caso

Lo más cercano que creo es usar git reflogy analizar lo último moving from branch1 to branch2ygit checkout branch1

manojlds
fuente
11

Simplemente agregue algunos detalles más a las respuestas anteriores para comprender el mecanismo por el cual git checkout @{-N}funciona. Recorre el registro para inspeccionar el historial de pago, por lo que si desea implementar algo similar por su cuenta, debería poder analizar el resultado de la git reflogbúsqueda de checkout:líneas. Puede verificar la implementación en la fuente git sha1_name.c, específicamente la función interpret_nth_prior_checkout.

ddd
fuente
2
para los perezosos
Mariusz Pawelski
10

La versión de Git 2.23introdujo el git switchcomando que puedes usar para hacer eso (y más). Citando la documentación oficial:

Cambia a una rama específica. El árbol de trabajo y el índice se actualizan para coincidir con la rama. Todas las nuevas confirmaciones se agregarán a la punta de esta rama.

En su caso específico, puede emitir git switch -para volver a la sucursal en la que estaba anteriormente. Puede ejecutar el mismo comando nuevamente para regresar a la primera rama.

PD: No es que aún no sepas cómo hacerlo (quiero decir, han pasado 7 años desde que hiciste esta pregunta), pero este comando es menos confuso y amigable para los principiantes, ya que aborda una confusión común que surge cuando se usa git checkout.

Miguel
fuente
5

Llegué a esta pregunta con el mismo pensamiento para verificar mi rama anterior. Estoy usando ohmyz en Mac. El siguiente comando me ayudó.

$ gco -
$ git checkout -
Venkat.R
fuente
Solo un aviso de que ohmyz es súper lento en comparación con otros administradores de paquetes zsh. Recomendaría echar un vistazo a antígeno o zplug .
spex
2
En caso de que no esté claro, esto funciona porque el complemento Git de Oh My Zsh se define gcocomo una forma corta de escribir git checkout. Así que gco -solo llama git checkout -.
Rory O'Kane
por supuesto mi amigo no hace falta explicarlo git checkout -. para a prueba de fallos actualizado.
Venkat.R
1

La solución más popular es:

git checkout @{-N}

Donde N - paso cuenta de las ramas para retroceder en el historial de pago.

Jackkobec
fuente
1

Aquí hay indicadores de las partes de la documentación de Git que describen git checkout -y las git checkout @{-1}soluciones dadas por las otras respuestas:

  • Cuando se especifica una revisión Git para cualquier comando, @{-<n>}, por ejemplo,@{-1} significa “el n º rama / COMMIT desprotegido antes de la actual.” La documentación para git checkout <branch>reitera: "Puede usar la @{-N}sintaxis para referirse a la N-ésima última rama / confirmación extraída mediante la git checkoutoperación".

  • Para el <branch>argumento degit checkout "también puede especificar ' -', que es sinónimo de ' @{-1}'".

Rory O'Kane
fuente