¿Alguien puede decirme la diferencia entre HEAD, árbol de trabajo e índice, en Git?
Por lo que entiendo, todos son nombres para diferentes ramas. ¿Es correcta mi suposición?
Editar
encontré esto
Un único repositorio de git puede rastrear un número arbitrario de ramas, pero su árbol de trabajo está asociado con solo una de ellas (la rama "actual" o "extraída"), y HEAD apunta a esa rama.
¿Significa esto que HEAD y el árbol de trabajo son siempre iguales?
git
version-control
Joyce Babu
fuente
fuente
HEAD
es el commit en la punta de la rama actual. Si acaba de retirar la rama, es decir, no tiene archivos modificados, entonces su contenido coincide con el árbol de trabajo. Tan pronto como modifiques algo, ya no coincidirá.Staging Area
a esa lista. Lo que esHEAD
,Working Tree
,Index
yStaging Area
Respuestas:
Algunas otras buenas referencias sobre esos temas:
(nota: como se ha comentado por Timo Huovinen , esas flechas no lo que los compromete señalan son, que es el fin del flujo de trabajo , básicamente mostrando flechas como
1 -> 2 -> 3 -> 4
donde1
se cometen la primera y4
es la última)fuente
La diferencia entre HEAD (rama actual o último estado confirmado en la rama actual), índice (también conocido como área de preparación) y árbol de trabajo (el estado de los archivos en la caja) se describe en la sección "Los tres estados" de los "1.3 Conceptos básicos de Git " capítulo del libro Pro Git de Scott Chacon (licencia Creative Commons).
Aquí está la imagen que lo ilustra de este capítulo:
En la imagen de arriba, "directorio de trabajo" es lo mismo que "árbol de trabajo", el "área de ensayo" es un nombre alternativo para git "index", y HEAD apunta a la rama actualmente desprotegida, que apunta a la última confirmación en el " directorio git (repositorio) "
Tenga en cuenta que
git commit -a
organizaría los cambios y se comprometería en un solo paso.fuente
working tree
parece ser preferido aworking directory
hoy en día. Ver github.com/git/git/commit/…Su árbol de trabajo es lo que está realmente en los archivos en los que está trabajando actualmente.
HEAD
es un puntero a la bifurcación o confirmación que verificó por última vez, y que será el padre de una nueva confirmación si la realiza. Por ejemplo, si está en lamaster
rama, entoncesHEAD
señalarámaster
, y cuando se comprometa, esa nueva confirmación será un descendiente de la revisión quemaster
señaló, ymaster
se actualizará para apuntar a la nueva confirmación.El índice es un área de preparación donde se prepara la nueva confirmación. Esencialmente, el contenido del índice es lo que irá en la nueva confirmación (aunque si lo hace
git commit -a
, esto agregará automáticamente todos los cambios a los archivos que Git conoce en el índice antes de confirmar, por lo que confirmará el contenido actual de su árbol de trabajo )git add
agregará o actualizará archivos del árbol de trabajo a su índice.fuente
git commit -a
(debe agregarlosgit add
), por lo que su árbol de trabajo puede tener archivos adicionales que su índice, su repositorio local o su repositorio remoto no tiene.HEAD
se refiere a la confirmación más reciente, por lo que cuando se compromete, se actualizaHEAD
a su nueva confirmación, que coincide con el índice. Empujar no tiene mucho que ver con eso: crea ramas en las ramas de coincidencia remota en su repositorio local.Árbol de trabajo
Su árbol de trabajo son los archivos en los que está trabajando actualmente.
Índice de Git
El "índice" de git es donde coloca los archivos que desea comprometer en el repositorio de git.
El índice también se conoce como caché , caché de directorio , caché de directorio actual , área de ensayo , archivos etapas .
Antes de "confirmar" (registrar) archivos en el repositorio de git, primero debe colocar los archivos en el "índice" de git.
El índice no es el directorio de trabajo: puede escribir un comando como
git status
, y git le dirá qué archivos en su directorio de trabajo se han agregado al índice git (por ejemplo, usando elgit add filename
comando).El índice no es el repositorio de git: los archivos en el índice de git son archivos que git confirmaría en el repositorio de git si usara el comando git commit.
fuente
reset --hard HEAD
para asegurarse de que su índice == su árbol de trabajo. y luego:mkdir history && git checkout-index --prefix history/ -a
El resultado es una duplicación de todo su árbol de trabajo en suhistory/
directorio. Ergo git index> = directorio de trabajo gitecho untracked-data > untracked-file
, antes o después de los pasosgit reset --HARD
ygit checkout-index
. Encontrará que el archivo no rastreado no está en elhistory
directorio. También puede modificar tanto el índice como el árbol de trabajo de forma independiente, aunque modificar el índice sin tocar primero el árbol de trabajo es difícil (requiere usargit update-index --index-info
).