Utiliser des branches

Git checkout

 

Cette page traite de la commande git checkout. Différents cas d'usage et de figure seront abordés. Dans la terminologie Git, un « checkout » désigne un basculement entre différentes versions d'une entité cible. La commande git checkout agit sur trois entités distinctes : les fichiers, les commits et les branches. Outre la définition de « checkout », l'expression « checking out » est couramment utilisée pour indiquer l'exécution de la commande git checkout. Dans la rubrique Annuler des changements, nous avons vu comment la commande git checkout eut être utilisée pour afficher d'anciens commits. La majeure partie de ce document portera sur les opérations de checkout sur les branches.

Faire un checkout des branches est similaire à faire un checkout d'anciens commits et d'anciens fichiers dans la mesure où le répertoire de travail est mis à jour pour correspondre à la branche/révision sélectionnée ; cependant, les nouveaux changements sont enregistrés dans l'historique du projet, c'est-à-dire que ce n'est pas une opération en lecture seule.

Checkout de branches

La commande git checkout vous permet de basculer entre les branches créées au moyen de git branch. L'extraction d'une branche entraîne une mise à jour des fichiers contenus dans le répertoire de travail, qui s'alignent sur la version stockée dans cette branche. En outre, Git reçoit l'ordre d'enregistrer tous les nouveaux commits sur cette branche. Considérez cette opération comme une manière de sélectionner la ligne de développement sur laquelle vous travaillez.

Disposer d'une branche dédiée à chaque nouvelle fonctionnalité est un changement radical par rapport au workflow SVN classique. Il vous permet d'essayer facilement de nouvelles choses sans craindre de détruire les fonctionnalités existantes. Vous pouvez également travailler sur de nombreuses fonctionnalités en même temps. De plus, les branches simplifient également certains workflows de collaboration.

La commande git checkout peut parfois être confondue avec la commande git clone. La différence entre les deux commandes est que la commande git clone fonctionne pour faire un fetch du code à partir d'un dépôt distant, tandis que la commande git checkout permet de basculer entre les versions de code déjà présentes sur le système local.

Utilisation : branches existantes

En supposant que le dépôt dans lequel vous travaillez contient des branches préexistantes, vous pouvez basculer entre ces branches avec la commande git checkout. Pour déterminer quelles branches sont disponibles et quel est le nom de la branche en cours, exécutez git branch.

$> git branch
master
another_branch
feature_inprogress_branch
$> git checkout feature_inprogress_branch

L'exemple ci-dessus montre comment afficher une liste de branches disponibles en exécutant la commande git branch et passer à une branche spécifique, dans le cas présent, feature_inprogress_branch.

Nouvelles branches

Git checkout fonctionne main dans la main avec git branch. La commande git branch peut être utilisée pour créer une branche. Lorsque vous voulez démarrer une nouvelle fonctionnalité, vous créez une branche hors master à l'aide de la commande git branch nouvelle_branche. Une fois créé, vous pouvez ensuite utiliser git checkout nouvelle_branche pour basculer vers cette branche. De plus, la commande git checkout accepte un argument -b qui agit comme une méthode pratique pour créer la branche et basculer vers elle immédiatement. Vous pouvez travailler sur plusieurs fonctionnalités dans un seul dépôt en basculant entre les branches avec git checkout.

git checkout -b <nouvelle-branche>

L'exemple ci-dessus crée et extrait simultanément la branche <nouvelle-branche>. L'option -b est un flag de commodité qui ordonne à Git d'exécuter git branch <nouvelle-branche> avant git checkout <nouvelle-branche>.

git checkout -b <nouvelle-branche> <branche-existante>

Par défaut, git checkout -b basera la nouvelle-branche hors du HEAD actuel. Un paramètre de branche supplémentaire facultatif peut être transmis à git checkout. Dans l'exemple ci-dessus, la <branche-existante> est transmise et base la nouvelle-branche sur la branche-existante au lieu du HEAD actuel.

Basculement entre branches

Naviguer entre les branches est une opération directe. Exécuter la commande suivante placera HEAD sur la pointe de <nom_branche>.

git checkout <nom_branche>

Git suit un historique des opérations « checkout » dans le reflog. Vous pouvez exécuter git reflog pour afficher l'historique.

Commande git checkout sur une branche distante

Lorsque vous collaborez avec une équipe, il est courant d'utiliser des dépôts distants. Ces dépôts peuvent être hébergés et partagés, ou ils peuvent être la copie locale d'un autre collègue. Chaque dépôt distant contiendra son propre ensemble de branches. Pour faire le checkout d'une branche distante, vous devez d'abord faire un fetch du contenu de cette branche.

git fetch --all

Dans les versions modernes de Git, vous pouvez ensuite effectuer un checkout de la branche distante comme une branche locale.

git checkout <branche_distante>

Les anciennes versions de Git nécessitent la création d'une branche basée sur la remote.

git checkout <branche_distante> origin/<branche_distante>

De plus, vous pouvez faire le checkout d'une nouvelle branche locale et la réinitialiser au dernier commit des branches distantes.

git checkout -b <nombranche>
git reset --hard origin/<nombranche>

HEAD détachée

Maintenant que nous connaissons les trois utilisations principales de git checkout sur les branches, il est essentiel de discuter de l'état « HEAD détachée ». Rappelez-vous que Git utilise HEAD pour faire référence à l'instantané actuel. En interne, la commande git checkout met simplement à jour l'élément HEAD sur le point du commit ou de la branche spécifié. Lorsqu'il pointe vers une branche, Git ne se plaint pas, mais quand vous extrayez un commit, il bascule à l'état « HEAD détachée ».

Ce signal vous avertit que toutes les opérations que vous effectuez sont isolées du reste de votre projet. Si vous commencez à développer une fonctionnalité à l'état « HEAD détachée », vous ne pourrez pas y revenir grâce à une branche. Si vous extrayez une autre branche (p. ex. pour y merger votre fonctionnalité), il ne vous sera pas possible de la référencer :

En principe, vous devriez toujours travailler sur une branche, jamais sur une HEAD détachée. Par conséquent, vos nouveaux commits sont automatiquement référencés. Cependant, si vous vous contentez d'examiner un ancien commit, peu importe si vous êtes passé à l'état « HEAD détachée » ou non.

Résumé

Cette page se concentre sur l'utilisation de la commande git checkout lors de changement de branches. En résumé, la commande git checkout, utilisée sur les branches, modifie la cible de la réf HEAD. Elle peut être utilisée pour créer des branches, changer de branches et faire un checkout de branches distantes. La commande git checkout est un outil essentiel pour les opérations Git standard. Il s'agit d'une contrepartie de la commande git merge. Les commandes git checkout et git merge sont des outils critiques pour activer git workflows.

Prêt à tester la création de branches ?

Essayez ce tutoriel interactif.

Démarrez maintenant