¿Qué significa realmente git checkouts?

96

¿Qué hay checkouten git?

Sé que una vez que lo haces checkoutcon una rama en particular, los HEADpuntos apuntan a esa rama. ¿Pero qué significa realmente? ¿Significa que luego puedo trabajar en esa rama? Si es así, entonces, sin verificar una rama, ¿no puedo trabajar en ella?

Además, ¿qué remote checkoutsignifica? ¿Qué utilidad tiene?

daehaai
fuente
1
Ninguna toma. Sí, lo he hecho y me encuentro con la teoría de lo que significa. es decir, apunte a HEAD, etc. Pero quiero saber desde el punto de vista del "código de pago - hacer cambios - registrarse" o es diferente?
daehaai
25
@antonijn - Intenté buscar en Google la pregunta - este es el primer resultado - un poco triste que una vez que llegué aquí vi que la pregunta estaba cerrada y esta actitud loca que todos tienen - vengo de TFS y yo Estoy empezando a sospechar que "Checkout" significa algo completamente diferente en GIT. Quiero saber qué significa en git-land.
BrainSlugs83

Respuestas:

60

Como notó, HEADes una etiqueta que indica dónde se encuentra en el árbol de confirmación. Se mueve contigo cuando pasas de un compromiso a otro. git checkout <commit>es el mecanismo básico para moverse en el árbol de confirmación, moviendo su foco ( HEAD) a la confirmación especificada.

La confirmación puede ser especificado por cualquiera de un número de maneras, cometer de hash, nombre de la sucursal, nombre de la etiqueta, la sintaxis relativa ( HEAD^, HEAD~1, etc.) y así sucesivamente. A menudo es útil considerar que un checkout está cambiando de sucursal, y hay algunas opciones que funcionan desde esa perspectiva, pero todas hacen referencia a confirmaciones.

Verificar una confirmación tiene algunos efectos secundarios además de moverse HEAD.

  • El directorio de trabajo se actualiza al estado de la confirmación extraída.
  • si se especifica un nombre de rama, el pago activa esa rama. La rama activa se moverá junto con las nuevas confirmaciones que se agreguen.
    • con la -bopción, se creará una nueva rama basada en la confirmación actual y luego se activará.
    • con la --trackopción, la rama extraída puede ser consciente de una rama remota
    • con la --orphanopción se crea una nueva rama (como con -b) pero no se basará en ninguna confirmación existente.

Hay algunas opciones más, sobre las que puede leer en la página de manual de git checkout , todas las cuales giran en torno al movimiento de un compromiso a otro, simplemente variando el efecto que tiene ese movimiento además de moverse HEAD.

David Culp
fuente
Por lo tanto, parece que "pago" significa algo completamente diferente (en comparación con TFS de todos modos; el equivalente de TFS sería "obtener" un "conjunto de cambios" en particular). ¡Me alegro de haber buscado esto! - ¿Existe alguna constante mágica para "último"? (en TFS es "T") - ¿De esa manera podemos descargar la última versión del código sin conocer la etiqueta "HEAD"?
BrainSlugs83
1
Si estás en una rama, el nombre de la rama es la última confirmación para esa rama; si no estás en una rama, estás en la última confirmación. Usaría el comando log para encontrar la confirmación más reciente en el repositorio sin tener en cuenta la rama y luego moverme manualmente a ella, pero estoy seguro de que se puede automatizar si es necesario.
David Culp
Sobre el último párrafo: tenga en cuenta que git checkout <commit> <path>no cambia de rama.
gala
Su explicación no está mal, pero se le olvidó una muy importante (y potencialmente peligrosa) de casos de uso: git checkout <path>.
Eric Duminil
24

Permítanme explicar algunos casos de uso de pago con archivo, carpeta y ramas para que pueda ser útil para comprender.

Digamos que tenemos una carpeta nombrada devy index.htmltambién se realiza un seguimiento de todo y el directorio de trabajo está limpio.

Si cambio accidentalmente el nombre del archivo index.htmly quiero deshacer eso, simplemente git checkout index.htmllo usaré, recuperará el estado del archivo de la rama actualmente seleccionada del repositorio.

Ahora, si hice algún cambio en la devcarpeta y quiero recuperarlo. Puedo usarlo, git checkout devpero ¿qué pasa si ya hay una rama nombrada en devlugar de verificar esa carpeta? Para evitar eso, preferiría hacerlo git checkout -- dev.

Ahora aquí, el doble guión desnudo representa la rama actual y le pide a git la carpeta devde la rama seleccionada actualmente.

De manera similar, si lo hago git checkout alpha dev, desplegará la carpeta dev de la rama alfa.

Esta respuesta es para su primera pregunta 'git checkout realmente significa'.

bawa g
fuente
2
En su última línea Esta respuesta es para su primera pregunta 'git checkout realmente significa'. ¿Está revisando la carpeta 'realmente' de la rama 'media': P
Paramvir Singh Karwal
22

"Para verificar" significa que toma cualquier confirmación del repositorio y vuelve a crear el estado del archivo asociado y el árbol de directorios en el directorio de trabajo.

Cuando revisa una confirmación que no es una cabeza de rama (p git checkout HEAD~2. Ej. ), Está en una llamada cabeza separada . Puede crear confirmaciones aquí, pero una vez que cambie a una rama diferente, esas confirmaciones no serán recuperables por un nombre de rama e incluso podrían ser eliminadas por el recolector de basura después de un tiempo.

Michael Wild
fuente