Rattacher la tête dans Git
Un référentiel Git peut être défini comme un groupe d’objets et de références. Les branches sont les objets que nous utilisons pour présenter notre travail. Git traite également les balises qui référencent les commits dans la branche particulière.
Un commit
est probablement l’état du code source utilisé à un certain moment dans un certain temps. Les Commits
se composent de parents et d’enfants, ainsi que de données complètes sur qui a créé le commit et quand il a été créé. Les Commits
sont placés dans le référentiel en tant qu’objets dans la branche.
La référence HEAD
pointe vers le dernier commit de la branche actuelle. Le pointeur HEAD
est une référence à la branche actuellement extraite, et il pointe vers le haut d’une branche.
Cependant, vous pouvez remonter le temps sans vérifier une branch. Vous pouvez utiliser le pointeur HEAD
pour récupérer n’importe quel commit dans une branche, puis vous pouvez utiliser l’index pour récupérer facilement n’importe quelle version d’un fichier.
Vous pouvez utiliser le pointeur HEAD
et les pointeurs d’index pour effectuer le check-out
d’un commit spécifique appelé état HEAD détaché
dans Git. De plus, vous pouvez extraire un commit spécifique et créer une nouvelle branche basée sur un commit spécifique dans une branche.
Cela ne deviendra pas un problème si nous ne le faisons qu’une fois dans une lune bleue. Cependant, si nous le répétons beaucoup, nous commencerons bientôt à nous demander comment revenir à cette branche sur laquelle nous travaillions.
La solution est très simple, car avant de checker une branche, il faut utiliser la commande git checkout master
. Cette commande nous ramène à la branche sur laquelle nous travaillions avant le commit, mais cela n’affecte pas le commit que nous étions en train de vérifier.
Une solution propre serait de mettre en place un nouveau référentiel Git dédié à la tenue de la série de correctifs et de le rendre disponible pour que d’autres puissent extraire la dernière branche à tout moment.
Ces situations sont suffisamment rares pour que la convivialité et le coût des performances de l’implémentation de HEAD détachés l’emportent sur leurs avantages, donc Git manque actuellement de cette fonctionnalité. Git peut modifier les commits. Cependant, il est impossible de modifier le dernier commit sur un HEAD détaché.
Git a un moyen de supprimer définitivement les commits en créant une branche secrète, en enregistrant les données de commit dans cette branche, puis en supprimant définitivement le commit de HEAD
. Cependant, cette fonctionnalité n’est disponible que lorsqu’un seul commit est détaché de HEAD
. Si un commit a plusieurs parents, il est impossible de le supprimer de cette branche.
Tête détachée dans Git
Cependant, lorsque nous passons à une autre branche, la situation est différente. Si notre répertoire de travail est extrait, il est mis à jour en HEAD
et nous ne pouvons plus modifier les fichiers qu’il contient, ou nous pouvons créer de nouvelles modifications si elles n’entrent pas en conflit avec la branche vers laquelle nous sommes passés.
Dans ce cas, HEAD
est détaché de la branche courante. En même temps, nous pouvons utiliser la commande git checkout
pour changer de branche sans mettre à jour notre répertoire de travail vers HEAD
, donc HEAD
peut être détaché en même temps qu’il est attaché.
C’est assez déroutant, mais cela peut être utile si nous voulons passer d’une branche à l’autre sans toucher rapidement au répertoire de travail ou passer à une autre branche et extraire simultanément un nouveau répertoire de travail. Nous pouvons utiliser git checkout -b <newbranchname> <commit>
pour ce faire.
Nous pouvons jouer comme ça; il suffit de vérifier la branche que nous désirons.
$ git checkout <branch>
Par example:
$ git checkout master
Si nous voulons conserver les modifications sur lesquelles nous travaillons, nous devons créer une nouvelle branche ou stocker nos modifications dans la branche. Tout checkout
d’un commit récent qui ne peut pas être le nom d’une de nos branches nous donnera un HEAD détaché.
Lorsque HEAD
est détaché, les commits semblent normaux, sauf qu’aucune branche nommée n’est mise à jour. C’est comme une branche inconnue. Par exemple, nous pouvons dire, si nous vérifions une branche distante avant de la suivre en premier ; finalement, on se retrouvera avec un HEAD
détaché.
Abdul is a software engineer with an architect background and a passion for full-stack web development with eight years of professional experience in analysis, design, development, implementation, performance tuning, and implementation of business applications.
LinkedIn