2009-05-11 10 views
21

Una cosa común que me gustaría hacer es revertir mi copia de trabajo a una revisión en particular, hacer algunas pruebas, y luego llevarla de nuevo a la cabeza de mi maestro actual. En el pasado, ingenuamente hice un "hash de git checkout" solo para perder la cabeza. Desde entonces, aprendí que puedo crear una sucursal y verificar eso, volver atrás y eliminar la sucursal, pero parece que son demasiados los pasos para realizar una simple comprobación. En el lenguaje de SVN, ¿hay alguna forma de revertir rápidamente y luego volver rápidamente a la punta del tronco en git?¿Necesita crear una rama para verificar una revisión de git específica?

Editar: Creo que mi confusión proviene del hecho de que cuando checkout de un hash y luego git log, no veo los cambios que ocurrieron después del picadillo desprotegido (que es razonable, cuando se piensa eso). Pero la respuesta aceptada es correcta; "git checkout branch" restaurará el encabezado a la rama anterior.

+0

Podría aclarar "perder la cabeza"? Me parece que nada está perdido. – Wok

Respuesta

27

Asumiendo que ya se encuentra en una rama (que siempre debe ser para los cambios que desea conservar), puede simplemente hacer

git checkout <revision to check out> 

Esto le llevará de la rama tema que estaba trabajando en (sin ramificación), en el que la copia de trabajo se refiere directamente a una ID de confirmación en lugar de a una rama de forma normal.

Entonces mover hacia atrás, simplemente:

git checkout <old branch name> 

Una forma útil de pensar en ello es lo siguiente: git checkout no altera las ramas; simplemente cambia lo que su copia de trabajo está mirando actualmente (es decir, HEAD), que podría ser una rama (en cuyo caso commits actualizará la rama) o un hash de confirmación aleatorio.

Como tal, siempre que los cambios que desea mantener estén en una rama, no tiene que preocuparse de que git checkout los pierda.

+0

+1 para la explicación de copias de trabajo apuntar a un hash de confirmación aleatorio –

+0

¿Incluye 'maestro' en lo que llama 'rama'? – Wok

+1

@wok: Sí. No hay nada especial sobre el maestro. – bdonlan

3

Si desea que Git muestre la punta de alguna línea de cambios, debe tenerla ramificada o etiquetada. Pero incluso si no haces una rama, ninguna de las confirmaciones se pierde. Permanece en el repositorio como un nodo de basura (es decir, no se puede acceder a través de ninguna rama o etiqueta), y se elimina solo algunos días/semanas más tarde cuando se hace "git gc".

Entonces, si desea tener un acceso fácil a los cambios, lo mejor es crear una sucursal temporal y trabajar allí. Si realiza confirmaciones fuera de una sucursal y luego realiza la compra en otra sucursal, necesitará usar el comando "git reflog" o buscar en los registros (directorio ".git/logs") para averiguar cuál fue el hash de los cambios que perdiste. Cuando conoces el hash, puedes hacer "hash de pago de git" o "git checkout -b new_branch hash" y recuperar la propina.

+0

¿Qué quiere decir con "mostrar" en "mostrar el consejo de alguna línea de cambios"? Si hago lo (IMO) natural y "checkout hash" me parece que no hay forma de volver a donde estaba sin (de alguna manera) conocer el hash donde estaba. – Nick

+0

Si Git muestra alguna línea de cambios, quiero decir que puede verla con comandos como "git branch", "git tag" o "gitk --all". ¿Te refieres a "saber el hash donde yo estaba" que estabas trabajando fuera de una sucursal? Se supone que no debes saber el hash donde estabas, se supone que debes saber la rama donde estabas. –

4

Sí, puede visitar cualquier revisión arbitraria con "git checkout" como usted describe. Si solicita una revisión arbitraria en lugar de una sucursal, git no tendrá ninguna forma obvia de realizar un seguimiento de los cambios que realice. Puedes ver dónde estabas antes consultando el reflog ("git reflog show"), pero en general, habrías estado en una sucursal antes, así que presumiblemente solo querrás cambiar a eso con "git checkout master" o similar.

Tenga en cuenta que este método no se ocupará automáticamente de los cambios no comprometidos en su área de trabajo, ya sea confirmar o esconder los cambios antes de moverse entre sucursales o usar "git checkout -m" para transportarlos mientras se mueve (y prepárate para lidiar con los conflictos de fusión si los cambios que estás llevando a cabo no son triviales).

Creo que las versiones recientes de git han introducido la abreviatura "@ {- 1}" para "donde estaba antes de moverme por última vez", que en realidad podría ser lo que usted desea en este caso. (No lo he usado, solo lea sobre esto en las notas de la versión).

+1

"Si solicita una revisión arbitraria en lugar de una sucursal, no podrá realizar ningún cambio, por supuesto". - Usted * puede * comprometerse. Es solo que trabajarás en "(sin ramificación)" (como se muestra en "git branch"), por lo que encontrar el compromiso después de verificar otra rama será difícil, a menos que escribas el hash de la confirmación o lo extraigas de la registros –

+0

Sí, buen punto; Lo admito, no lo intenté primero. – araqnid

+0

Si está usando extensiones git, le preguntará si desea pagar o crear una sucursal si no está en una sucursal, lo cual es bueno. Pero las extensiones de git pueden ser peligrosas para los novatos como yo porque ahora estoy obteniendo la importancia de verificar la revisión frente a la rama. – Chance

6

Puede crear una rama en el específico comprometen que desea para la obtención (de la página del manual)

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>] 

por lo llene la <start-point> como el SHA1 lo desea nueva rama <branchname> comenzar en y no separarás tu 'cabeza' de una rama en expansión.

Habrá otras cosas es probable que desee hacer para evitar que algunos de los archivos de trabajo en el estado que desee ....

Cuestiones relacionadas