Deux prix différents pour le même pain
Une fusion (merge en anglais) réunit le travail de deux branches Git en une seule. Git le fait seul quand les changements ne se touchent pas, et vous demande de choisir quand ils se contredisent.
Deux employés d’une épicerie changent le prix du pain, chacun sur sa branche. L’un le baisse pour une promotion, l’autre l’augmente. Git ne peut pas deviner lequel garder.
À la fin de cette leçon
Remarque
Je peux fusionner deux branches et résoudre un conflit.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Fusion | reprendre dans une branche le travail d’une autre | git merge |
| Avance rapide | une fusion où Git avance seulement le nom de la branche | |
| Commit de fusion | un commit qui a deux parents | |
| Conflit | un cas où deux branches ont changé les mêmes lignes | |
| Marques de conflit | les trois lignes que Git écrit dans le fichier | <<<<<<< HEAD |
| Résoudre | écrire le texte final, puis valider |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Deux sortes de fusion existent
Si main n’a pas bougé depuis la création de la branche, Git avance simplement le nom main. C’est une avance rapide (fast-forward en anglais). Aucun commit n’est créé.
Si les deux branches ont avancé, Git crée un commit de fusion. Ce commit a deux parents : la pointe de chaque branche.
Créer le dépôt dans le dossier epicerie
git init -b main epicerieAffiché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.
Écrire le tarif de départ
printf 'pain 1.10\nlait 0.95\nbeurre 2.40\n' > epicerie/tarif.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.
Choisir le fichier pour le commit
git -C epicerie add tarif.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.
Enregistrer le tarif de départ
git -C epicerie commit -m "Tarif de depart"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 la branche promo
git -C epicerie switch -c promoAffiché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.
Baisser le prix du pain sur promo
printf 'pain 0.99\nlait 0.95\nbeurre 2.40\n' > epicerie/tarif.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.
Enregistrer la promotion
git -C epicerie commit -am "Pain en promotion"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.
Revenir sur la branche main
git -C epicerie 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.
Augmenter le prix du pain sur main
printf 'pain 1.20\nlait 0.95\nbeurre 2.40\n' > epicerie/tarif.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.
Enregistrer l’augmentation
git -C epicerie commit -am "Augmenter le pain"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 promo dans main : conflit attendu
git -C epicerie merge promoAffiché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, ici main. La ligne ======= sépare les deux. La ligne >>>>>>> promo ferme la version de l’autre branche.
git status --short affiche UU devant ce fichier : les deux côtés l’ont modifié. Tant que les marques restent, le fichier n’est pas bon.
Lire le fichier en conflit
cat epicerie/tarif.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.
Résoudre : choisir le texte, effacer les marques
Pour résoudre un conflit, vous écrivez le texte final et vous effacez les trois lignes de marque. Puis git add dit à Git que c’est réglé, et git commit crée le commit de fusion.
Ici, les deux employés se mettent d’accord sur 1,05 €. L’option --no-edit garde le message que Git propose.
Écrire le prix décidé ensemble
printf 'pain 1.05\nlait 0.95\nbeurre 2.40\n' > epicerie/tarif.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.
Dire à Git que c’est réglé
git -C epicerie add tarif.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.
Créer le commit de fusion
git -C epicerie commit --no-editAffiché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 après la fusion
git -C epicerie --no-pager log --format=%sAffiché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. Ce n’est pas vrai : deux personnes ont changé les mêmes lignes, et Git vous demande de choisir. Rien n’est perdu. git merge --abort revient avant la fusion.