¿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

HEADes 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 Areaa esa lista. Lo que esHEAD,Working Tree,IndexyStaging AreaRespuestas:
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 -> 4donde1se cometen la primera y4es 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 -aorganizaría los cambios y se comprometería en un solo paso.fuente
working treeparece ser preferido aworking directoryhoy 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.
HEADes 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 lamasterrama, entoncesHEADseñalarámaster, y cuando se comprometa, esa nueva confirmación será un descendiente de la revisión quemasterseñaló, ymasterse 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 addagregará 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.HEADse refiere a la confirmación más reciente, por lo que cuando se compromete, se actualizaHEADa 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 filenamecomando).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 HEADpara asegurarse de que su índice == su árbol de trabajo. y luego:mkdir history && git checkout-index --prefix history/ -aEl 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 --HARDygit checkout-index. Encontrará que el archivo no rastreado no está en elhistorydirectorio. 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).