Aller au contenu
English

Bases des branches

  • Leçon 4
  • 25 min
  • Module 2 : Travailler avec les branches et les dépôts distants

Ce que vous saurez faire

Essayez une nouvelle idée sur une ligne de travail distincte, sans modifier le travail déjà correct. Les équipes font presque tous leurs changements ainsi.

Avant de commencerCe qu’il faut savoir et avoir sous la mainEnviron 25 minutes

Ce que vous devez savoir

Ce qu’il vous faut sur votre ordinateur

  • Le dépôt ~/projects/ticket-notes avec au moins deux commits, et le fichier tickets.txt. Vous les avez créés dans Suivre une première modification : exercice guidé : créer vos premiers commits.

  • Dans le dépôt, git status affiche nothing to commit, working tree clean (rien à enregistrer, arbre de travail propre). Si des changements apparaissent, faites d’abord un commit.

  • Si le dépôt manque, refaites Configurer Git : Étape 3 : créer un dépôt. Faites ensuite l’exercice guidé de Suivre une première modification.

  • Si le dépôt manque ou ne fonctionne plus, un script peut recréer l’état de départ de cette leçon. Dans ~/projects, exécutez :

    Fenêtre de terminal
    git clone https://github.com/Nextia-Intelligence/nextia-learning-labs.git
    sh nextia-learning-labs/C14/setup.sh m02-l01 --reset

    Exécutez la commande git clone une seule fois. Si vous avez déjà le dossier nextia-learning-labs, exécutez plutôt git -C nextia-learning-labs pull. Les étapes d’une demande de tirage : préparer le laboratoire d’exercice explique le script en détail. Le script crée ~/projects/c14-lab/ticket-notes avec les trois commits de Suivre une première modification sur main. Leurs empreintes sont les mêmes que dans cette leçon : 763ec59, 49397ba et d8ae027. Le commit que vous faites dans cette leçon porte votre nom et votre heure. Son empreinte diffère donc de 999a7c4. C’est normal. Utilisez ensuite ~/projects/c14-lab à la place de ~/projects dans cette leçon. --reset supprime d’abord un ancien dossier c14-lab, mais votre dossier ~/projects/ticket-notes ne change pas.

  • Les empreintes de cette leçon viennent du dépôt d’Amira. Vos empreintes sont différentes. Utilisez celles de votre propre git log.

Dans le module 1, chaque commit allait sur main. main est une branche : un nom qui pointe vers un commit. Quand vous faites un nouveau commit, Git avance l’étiquette de la branche vers ce nouveau commit. L’étiquette pointe toujours vers le commit le plus récent de cette ligne de travail.

Vous pouvez créer d’autres branches. Chacune est une étiquette distincte, donc chaque ligne de travail peut avancer indépendamment. Une nouvelle branche ne coûte presque rien : Git ne copie pas vos fichiers. Il écrit seulement la nouvelle étiquette.

Comment Git sait-il sur quelle branche vous êtes? Il utilise HEAD : un pointeur vers la branche où vous êtes maintenant. Quand vous faites un commit, Git déplace la branche vers laquelle HEAD pointe. Les autres branches ne bougent pas.

Trois commits en ligne, du plus ancien au plus récent : 49397ba, d8ae027 et 999a7c4. L'étiquette main pointe vers d8ae027. L'étiquette add-priorities pointe vers 999a7c4. HEAD pointe vers main.
Les branches sont des étiquettes. Ici, main pointe vers d8ae027 et add-priorities pointe vers le commit plus récent 999a7c4. HEAD indique que vous êtes sur main.

Chaque commit est identifié par son empreinte de commit, que vous avez découverte dans le module 1. Un nom de branche change de cible quand la branche avance, mais une empreinte désigne toujours le même commit. Utilisez une empreinte quand vous devez parler d’un commit précis.

Exemple détaillé : une branche pour les niveaux de priorité

Section intitulée « Exemple détaillé : une branche pour les niveaux de priorité »

Amira veut ajouter des niveaux de priorité aux notes sur les billets. Elle doute que son équipe soit d’accord, donc elle utilise une nouvelle branche. D’abord, elle examine ses branches et son historique :

Terminal
git branch
git log --oneline
Sortie
* main
d8ae027 (HEAD -> main) Add first ticket note
49397ba Describe who the notes are for
763ec59 Add README

git branch liste les branches. Le * (astérisque) marque la branche où elle se trouve. Dans l’historique, HEAD -> main indique la même chose : HEAD pointe vers main, et main pointe vers d8ae027.

Elle crée une branche appelée add-priorities et y passe en une seule étape. L’option -c signifie « créer » :

Terminal
git switch -c add-priorities
git branch
Sortie
Switched to a new branch 'add-priorities'
* add-priorities
main

Elle crée maintenant priorities.txt avec une ligne, Priority levels: low, normal, urgent. (niveaux de priorité : faible, normal, urgent). Elle en fait ensuite un commit :

Terminal
git add priorities.txt
git commit -m "Add priority levels"
git log --oneline
Sortie
[add-priorities 999a7c4] Add priority levels
1 file changed, 1 insertion(+)
create mode 100644 priorities.txt
999a7c4 (HEAD -> add-priorities) Add priority levels
d8ae027 (main) Add first ticket note
49397ba Describe who the notes are for
763ec59 Add README

Le nouveau commit est sur add-priorities. main n’a pas bougé : elle pointe toujours vers d8ae027. C’est la situation du schéma ci-dessus, mais avec HEAD sur add-priorities.

Ensuite, elle revient à main et liste les fichiers :

Terminal
git switch main
ls
Sortie
Switched to branch 'main'
README.md tickets.txt

priorities.txt a disparu du dossier. C’est normal. Quand vous changez de branche, Git modifie les fichiers de l’arbre de travail pour correspondre au commit de cette branche. Le fichier reste en sécurité dans le commit 999a7c4. Quand elle exécute git switch add-priorities, le fichier revient.

Pour voir toutes les branches en même temps, elle ajoute --all :

Terminal
git log --oneline --all
Sortie
999a7c4 (add-priorities) Add priority levels
d8ae027 (HEAD -> main) Add first ticket note
49397ba Describe who the notes are for
763ec59 Add README
  1. Dans ~/projects/ticket-notes, exécutez git status. La sortie doit inclure working tree clean (arbre de travail propre). Sinon, faites un commit de vos changements ou supprimez-les d’abord.

  2. Créez une branche et passez-y :

    Fenêtre de terminal
    git switch -c add-priorities

    La sortie est Switched to a new branch 'add-priorities' (passage à une nouvelle branche « add-priorities »).

  3. Dans votre éditeur, créez priorities.txt avec la ligne Priority levels: low, normal, urgent. Enregistrez-le.

  4. Préparez le fichier et faites un commit :

    Fenêtre de terminal
    git add priorities.txt
    git commit -m "Add priority levels"
  5. Exécutez git log --oneline --all. Le commit le plus récent porte (HEAD -> add-priorities) (HEAD pointe vers add-priorities). main est sur le commit précédent.

  6. Passez à main :

    Fenêtre de terminal
    git switch main
  7. Exécutez ls. priorities.txt n’est pas dans la liste.

  8. Revenez avec git switch add-priorities, puis exécutez encore ls. priorities.txt est dans la liste.

  9. Revenez à main avant de continuer.

Créez une deuxième branche à partir de main, appelée add-contacts. Sur cette branche, créez contacts.txt avec les noms d’une équipe de soutien, puis faites un commit.

Répondez ensuite à ces questions avec git log --oneline --all et ls :

  1. Vers quel commit chacune de vos trois branches pointe-t-elle?
  2. Quand vous êtes sur add-contacts, est-ce que priorities.txt est dans le dossier? Pourquoi?
Afficher les réponses
  1. main pointe vers le même commit qu’avant la leçon. add-priorities et add-contacts pointent chacune vers leur propre nouveau commit.
  2. Non. Vous avez créé add-contacts à partir de main, et main ne contient pas priorities.txt. Chaque branche contient seulement les commits de sa propre ligne de travail.

Erreur courante

Mon changement m'a suivi sur l'autre branche

Symptôme : vous modifiez tickets.txt sur main, mais vous ne faites pas de commit. Vous exécutez ensuite git switch add-priorities. Git change de branche et affiche :

Switched to branch 'add-priorities'
M tickets.txt

Votre changement est maintenant dans l’arbre de travail de add-priorities.

Cause : les changements sans commit n’appartiennent pas à une branche. Ils restent dans l’arbre de travail quand vous changez de branche. Git bloque le changement de branche seulement si un changement risque d’être perdu. Il affiche alors une erreur.

Solution :

  1. Exécutez git switch main pour revenir.
  2. Faites un commit du changement sur main s’il appartient à cette branche.

Pour éviter cela, exécutez git status avant de changer de branche. Changez de branche seulement quand la sortie indique working tree clean.

Erreur courante

Référence non valide

Symptôme : git switch add-priority affiche fatal: invalid reference: add-priority (erreur fatale : référence non valide : add-priority).

Cause : aucune branche ne porte ce nom. Il s’agit généralement d’une faute de frappe. Ici, le nom est add-priorities, pas add-priority.

Solution : exécutez git branch pour voir les bons noms, puis changez de branche à nouveau.

Vérifiez votre compréhension

Prédisez : Amira est sur add-priorities. Elle fait deux autres commits. Quelles étiquettes de branche bougent, et est-ce que main change?

Afficher la réponse

Seule add-priorities bouge. Elle avance une fois par commit, donc elle finit sur le deuxième nouveau commit. main ne change pas, car HEAD pointe vers add-priorities. Git déplace seulement la branche vers laquelle HEAD pointe.

Vérifiez votre compréhension

Vérification pratique : avec une seule commande, montrez votre branche actuelle et le commit vers lequel chaque branche pointe.

Afficher la réponse

Exécutez git log --oneline --all. Chaque nom de branche apparaît à côté du commit vers lequel elle pointe. HEAD -> (HEAD pointe vers) indique la branche où vous êtes. Vous pouvez aussi utiliser git branch -v, qui liste chaque branche avec son empreinte de commit.

Récapitulatif

  • Une branche est une étiquette qui pointe vers un commit. Elle avance quand vous faites un commit sur cette branche.
  • HEAD pointe vers la branche où vous êtes. git branch et git log --oneline --all l’affichent.
  • git switch -c name crée une branche et y passe. git switch name passe à une branche existante.
  • Quand vous changez de branche, Git modifie les fichiers pour correspondre à cette branche. Les changements sans commit restent dans l’arbre de travail.

Leçon suivante : Synchroniser de façon réfléchie