Quelqu'un peut-il me dire la différence entre HEAD, arbre de travail et index, dans Git?
D'après ce que je comprends, ce sont tous des noms pour différentes branches. Est-ce que mon hypothèse est correcte?
J'ai trouvé ça
Un seul référentiel git peut suivre un nombre arbitraire de branches, mais votre arbre de travail est associé à une seule d'entre elles (la branche "actuelle" ou "extraite"), et HEAD pointe sur cette branche.
Est-ce que cela signifie que HEAD et l'arbre de travail sont toujours les mêmes?
Quelques autres bonnes références sur ces sujets:
J'utilise l'index comme un point de contrôle .
Quand je suis sur le point de faire un changement qui pourrait mal tourner - quand je veux explorer une direction que je ne suis pas sûr de pouvoir suivre ou même si c'est une bonne idée, comme une refactorisation conceptuellement exigeante ou une modification de type de représentation - je vérifie mon travail dans l'index. S'il s'agit du premier changement que j'ai apporté depuis ma dernière validation, je peux utiliser le référentiel local comme point de contrôle, mais j'ai souvent un changement conceptuel que je suis en train de mettre en œuvre sous forme de petites étapes. Je veux effectuer un point de contrôle après chaque étape, mais enregistrer le commit jusqu'à ce que je sois revenu au code testé et fonctionnel.
Remarques:
l'espace de travail est l'arborescence de répertoires des fichiers (sources) que vous voyez et modifiez.
L’index est un grand fichier binaire unique dans
<baseOfRepo>/.git/index
, qui répertorie tous les fichiers de la branche actuelle, leur sha1 les sommes de contrôle, les horodatages et le nom de fichier - ce n'est pas un autre répertoire contenant une copie des fichiers.Le référentiel local est un répertoire caché (
.git
) comprenant un répertoireobjects
contenant toutes les versions de chaque fichier du référentiel ( branches locales et des copies de branches distantes) en tant que fichier "blob" compressé.Ne considérez pas les quatre "disques" représentés dans l'image ci-dessus comme des copies séparées des fichiers de dépôt.
Ce sont essentiellement des références nommées pour les commits Git. Il existe deux principaux types de références: les balises et les têtes.
- Les balises sont des références fixes qui marquent un point spécifique de l’historique, par exemple la version 2.6.29.
- Au contraire, les têtes sont toujours déplacées pour refléter la position actuelle du développement du projet.
(note: comme commenté par Timo Huovinen , ces flèches ne correspondent pas à ce que les commits désignent, c’est l’ordre du flux de travail , montrant essentiellement les flèches sous la forme 1 -> 2 -> 3 -> 4
où 1
est le premier commit et 4
est le dernier)
Nous savons maintenant ce qui se passe dans le projet.
Mais pour savoir ce qui se passe ici, il existe actuellement une référence spéciale appelée HEAD. Il sert deux objectifs principaux:
- il dit à Git quel commit prendre les fichiers à la caisse, et
- il indique à Git où placer les nouveaux commits lorsque vous vous commettez.
Lorsque vous exécutez
git checkout ref
, il pointeHEAD
sur la référence que vous avez désignée et en extrait les fichiers. Lorsque vous exécutezgit commit
, il crée un nouvel objet de validation, qui devient un enfant deHEAD
actuel. Normalement,HEAD
pointe vers l’une des têtes, ainsi tout se passe bien.
La différence entre HEAD (branche actuelle ou dernier état validé sur la branche actuelle), index (zone de transfert) et un arbre de travail (l'état de fichiers à la caisse) est décrit dans Section "Les trois états" du chapitre "1.3 Les bases de Git " de Pro Git Livre de Scott Chacon (licence Creative Commons).
Voici l'image l'illustrant de ce chapitre:
Dans l'image ci-dessus, "répertoire de travail" est identique à "arbre de travail", la "zone de transfert" est un autre nom pour git "index", et TÊTE pointe vers la branche actuellement extraite, ce qui pointe vers la dernière validation dans le "répertoire git (référentiel)"
Notez que git commit -a
mettrait en place les modifications et les validerait en une étape.
Votre arbre de travail est ce qui se trouve réellement dans les fichiers sur lesquels vous travaillez actuellement.
HEAD
est un pointeur sur la branche ou le dernier commit que vous avez extrait, et qui sera le parent d'un nouveau commit si vous le créez. Par exemple, si vous êtes sur la branche master
, alors HEAD
pointera sur master
et lorsque vous validez, ce nouveau commit sera un descendant de la révision à laquelle master
a pointé, et master
sera mis à jour pour pointer vers le nouveau commit. .
index est une zone de stockage intermédiaire dans laquelle le nouveau commit est préparé. Le contenu de l'index est ce qui sera inclus dans la nouvelle validation (bien que si vous faites git commit -a
, cela ajoutera automatiquement toutes les modifications apportées aux fichiers que Git connaît sur l'index avant la validation. contenu de votre arbre de travail). git add
ajoutera ou mettra à jour les fichiers de l'arborescence de travail dans votre index.
Votre arbre de travail sont les fichiers sur lesquels vous travaillez actuellement.
Le "index" git est l'endroit où vous placez les fichiers que vous voulez valider dans le référentiel git.
L’index est également appelé cache de répertoire , , cache de répertoire actuel , zone de stockage intermédiaire , mis en scène fichiers .
Avant de "valider" (archiver) des fichiers dans le référentiel git, vous devez d'abord les placer dans "index" git.
L’index est pas le répertoire de travail: vous pouvez taper une commande telle que git status
, et git vous indiquera quels fichiers de votre répertoire de travail ont été ajoutés à l’index git (par exemple, en utilisant la commande git add filename
).
L'index n'est pas le référentiel git: les fichiers de l'index git sont des fichiers que git pourrait valider dans le référentiel git si vous utilisiez la commande git commit.