Deux personnes, une seule liste de prix
Deux employés d’une petite boutique modifient la liste de prix le même après-midi. L’un augmente un prix. L’autre corrige une faute d’orthographe sur la même ligne.
S’ils partagent un seul dossier, l’un perd son travail. Le contrôle de version garde les deux versions et montre exactement où elles se contredisent.
À la fin de cette leçon
Remarque
Je peux travailler sur une branche et la fusionner.
Mots-clés
| Mot | Ce que ça veut dire |
|---|---|
| Dépôt distant | une copie partagée d’un dépôt, sur un serveur |
| Cloner | copier un dépôt avec tout son historique |
| Branche | une ligne de travail à part, avec ses propres commits |
| Fusion | reprendre dans une branche le travail d’une autre |
| Conflit | une fusion où deux branches ont changé les mêmes lignes |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un clone copie tout l’historique
Un dépôt distant est la copie partagée d’un dépôt, gardée sur un serveur comme Gitea. Pour travailler dessus, on le clone. On obtient chaque fichier et chaque commit passé.
Le serveur Gitea du labo contient un dépôt nommé hello-git. La première commande le clone dans un dossier d’essai nommé revue. La deuxième lit son historique, le plus récent en premier.
Cloner le dépôt dans revue
git clone http://gitea:3000/student/hello-git.git revueAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire l’historique, une ligne par commit
git -C revue --no-pager log --format="%h|%an|%s"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une branche garde votre travail à part
Une branche est une ligne de commits à elle. Vous changez des fichiers dessus, et la branche principale reste comme elle était.
Chaque commit note son auteur. Dites d’abord à Git votre nom et votre adresse pour ce dossier. Puis créez une branche ouverture-tardive et changez une ligne dessus.
Ce dossier sert à s’exercer. Vous ne le pousserez pas.
Donner votre nom pour ce dossier
git -C revue config user.name "Etudiant"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Donner votre adresse pour ce dossier
git -C revue config user.email "[email protected]"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Créer une branche et s’y placer
git -C revue switch -c ouverture-tardiveAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Changer une ligne sur la branche
sed -i 's/Ada Lovelace/Ada Lovelace (hote)/' revue/visitors.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Valider le changement sur la branche
git -C revue commit -am "Marquer Ada comme hote"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une fusion réunit deux lignes de travail
Quand deux branches changent des lignes différentes, Git les fusionne sans aide. Quand les deux changent la même ligne, Git ne peut pas choisir : il s’arrête et vous demande. C’est un conflit.
Vous allez en fabriquer un exprès. Revenez à la branche principale. Changez la même ligne d’une autre façon. Validez. Puis fusionnez l’autre branche.
Revenir à la branche principale
git -C revue switch mainAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Changer la même ligne autrement
sed -i 's/Ada Lovelace/Ada L. Lovelace/' revue/visitors.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Valider le changement sur main
git -C revue commit -am "Ecrire les initiales"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Fusionner l’autre branche
git -C revue merge ouverture-tardiveAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire le fichier après la fusion
cat revue/visitors.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Trois lignes de marque montrent les deux versions
Git a écrit les deux versions dans le fichier. La ligne <<<<<<< HEAD ouvre la version de la branche où vous êtes. La ligne ======= la ferme. La ligne >>>>>>> ouverture-tardive ferme l’autre version.
Pour résoudre, vous modifiez le fichier avec le texte voulu et vous effacez les trois lignes de marque. Puis git add et git commit.
Ici, on s’arrête et on annule la fusion.
Annuler la fusion
git -C revue merge --abortAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Dessiner les deux branches en graphe
git -C revue --no-pager log --oneline --graph --allAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
On croit souvent qu’un conflit veut dire que le dépôt est cassé, ou que quelqu’un a fait une faute. Il veut dire que deux personnes ont changé les mêmes lignes. Rien n’est perdu. Choisissez le bon texte, ou lancez merge --abort pour revenir avant la fusion.
Pour aller plus loin
Relancez la fusion dans revue, et cette fois résolvez-la. Faites que la ligne dise Ada L. Lovelace (hote), effacez les trois lignes de marque, puis faites git add sur le fichier. Validez avec git -C revue commit --no-edit, qui garde le message proposé par Git au lieu d’ouvrir un éditeur.
Dessinez de nouveau le graphe et dites en quoi le commit de fusion diffère des autres. Ne poussez rien : revue reste un dossier d’essai.