web-dev-qa-db-fra.com

Quelle est la différence entre HEAD, arbre de travail et index dans Git?

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?


Modifier

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?

442
Joyce Babu

Quelques autres bonnes références sur ces sujets:

alt text

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:

  1. l'espace de travail est l'arborescence de répertoires des fichiers (sources) que vous voyez et modifiez.

  2. 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.

  3. Le référentiel local est un répertoire caché (.git) comprenant un répertoire objects 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.

alt text

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.

alt text

(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 -> 41 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 pointe HEAD sur la référence que vous avez désignée et en extrait les fichiers. Lorsque vous exécutez git commit, il crée un nouvel objet de validation, qui devient un enfant de HEAD actuel. Normalement, HEAD pointe vers l’une des têtes, ainsi tout se passe bien.

alt text

532
VonC

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:

Local Operations - working directory vs. staging area (index) vs git repository (HEAD)

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.

121
Jakub Narębski

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.

58
Brian Campbell

Arbre de travail

Votre arbre de travail sont les fichiers sur lesquels vous travaillez actuellement.

Index Git

  • 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.

38
Ashraf Alam