Voici le dixième volet de la formation Git. Dans mon précédent article, nous avons abordé le cas de figure le plus simple dans la fusion de deux branches : le fast-forward merge. Aujourd’hui nous allons voir un peu plus en détail ce qui se passe lorsqu’on fusionne deux branches qui ont évolué chacune de son côté.
Le merge commit par la pratique
Ce n’est pas la peine de repartir de zéro pour cet atelier. Placez-vous dans le répertoire formation-git/atelier-13
sur lequel nous avons travaillé précédemment. Il contient une branche master
et deux scripts hello.sh
et hello-cow.sh
:
$ cd ~/formation-git/atelier-13/
$ ls
hello-cow.sh hello.sh
$ git branch
* master
Pour commencer, créez une branche hello-figlet
et basculez dessus :
$ git switch --create hello-figlet Switched to a new branch 'hello-figlet'
Créez un script hello-figlet.sh
et éditez-le comme ceci :
#!/bin/bash
#
# hello-figlet.sh
if [ -x /usr/bin/figlet ]
then
figlet "Hello !"
else
echo "Hello !"
fi
Rendez-le exécutable et testez-le :
$ chmod +x hello-figlet.sh $ ./hello-figlet.sh _ _ _ _ _ | | | | ___| | | ___ | | | |_| |/ _ \ | |/ _ \ | | | _ | __/ | | (_) | |_| |_| |_|\___|_|_|\___/ (_)
Ajoutez le script à Git et validez-le avec un message qui va bien :
$ git add hello-figlet.sh $ git commit -m "Premier jet avec des majuscules ASCII." [hello-figlet 2ffed0b] Premier jet avec des majuscules ASCII. 1 file changed, 10 insertions(+) create mode 100755 hello-figlet.sh
Maintenant, revenez sur la branche master
:
$ git switch master Switched to branch 'master'
Voici à quoi ressemble le script hello.sh
:
#!/bin/bash
#
# hello.sh
echo "Hello !"
Peaufinez ce script comme ceci par exemple :
#!/bin/bash
#
# hello.sh
echo
echo "Hello !"
echo
exit 0
Enregistrez les modifications et validez-les :
$ git add hello.sh $ git commit -m "Peaufinage du script initial." [master aa4b0b8] Peaufinage du script initial. 1 file changed, 4 insertions(+)
Retournez sur la branche hello-figlet
:
$ git switch hello-figlet Switched to branch 'hello-figlet'
Éditez le script hello-figlet.sh
pour qu’il ressemble à ceci :
#!/bin/bash
#
# hello-figlet.sh
if [ -x /usr/bin/figlet ]
then
figlet "Hello ${USER} !"
else
echo "Hello ${USER} !"
fi
Enregistrez les modifications et validez-les :
$ git add hello-figlet.sh $ git commit -m "Personnalisation du message." [hello-figlet 37769ac] Personnalisation du message. 1 file changed, 2 insertions(+), 2 deletions(-)
Dans l’état actuel des choses, vous vous dites que le script hello-figlet.sh
est parfait, et vous souhaitez l’intégrer à la branche master
. La première chose à faire, c’est donc de basculer vers cette branche, étant donné que c’est la branche d’intégration :
$ git switch master Switched to branch 'master'
Avant d’aller plus loin, essayez de visualiser (mentalement ou sur un bout de papier) l’historique des commits sur les différentes branches. Essayez de deviner ce qui va se passer lorsqu’on fusionne les deux branches master
et hello-figlet
. Puis lancez-vous :
$ git merge hello-figlet
Git ouvre un éditeur de texte avec un message de commit automatique :
Merge branch 'hello-figlet'
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
Nous avons vu lors de l’atelier pratique sur la configuration de Git que c’est l’éditeur Vim qui est lancé par défaut, à moins que vous n’ayez explicitement configuré un autre éditeur comme Nano.
Vous êtes libres de modifier ce message à votre guise. Pour l’instant je vous conseille de le garder tel quel. Enregistrez les modifications dans Vim et fermez l’éditeur, ce qui se solde par la création d’un commit :
Merge made by the 'ort' strategy. hello-figlet.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100755 hello-figlet.sh
Quelques remarques en vrac :
- La branche
master
est la branche d’intégration. - La branche
hello-figlet
est la branche thématique. - Cette branche
hello-figlet
est basée sur la branchemaster
, mais cette branche a été modifiée depuis. - Les branches
master
ethello-figlet
ont un ancêtre commun, et lorsque nous fusionnons ces deux branches, nous essayons de combiner tout le travail qui a été effectué après ce commit.
Pour mieux visualiser ce qui se passe ici, jetez un œil sur le plan du métro de Paris, et plus précisément sur les lignes 2 et 6. En haut à gauche du plan, les deux lignes s’arrêtent à la station Charles de Gaulle Étoile. Puis chaque ligne part dans sa direction, et elles finissent par se rejoindre beaucoup plus loin, à la station Nation en bas à droite sur le plan.
Le merge commit de Git suit le même principe. Deux branches partent chacune dans leur direction, jusqu’à ce qu’elles finissent par se rejoindre tôt ou tard.
La particularité d’un merge commit, c’est qu’il possède deux parents :
- Le premier parent, c’est le dernier commit sur la branche courante.
- Le deuxième parent, c’est le dernier commit sur la branche externe qui a été fusionnée.
À présent nos branches sont bien fusionnées :
$ git branch
hello-figlet
* master
$ ls
hello-cow.sh hello-figlet.sh hello.sh
Il ne nous reste plus qu’à faire un brin de ménage en supprimant la branche hello-figlet
qui ne nous sert plus à rien :
$ git branch --delete hello-figlet Deleted branch hello-figlet (was 37769ac).
Exercice
Dans notre atelier pratique sur les branches, nous avons créé une série de branches. Pour commencer, effectuez une copie des fichiers de cet atelier vers un nouvel atelier :
$ cd ~/formation-git $ cp -R atelier-12/ atelier-15 $ cd atelier-15/hello/
- Affichez les branches de ce dépôt.
- Essayez de visualiser (mentalement ou sur un bout de papier) l’historique des commits.
- Essayez d’anticiper les opérations de fusion. Est-ce qu’il s’agira d’un fast-forward merge ou d’un merge commit ?
- Fusionnez toutes les branches vers la branche
master
. - Supprimez les branches qui ne servent plus à rien.
Lire la suite : Gérer les conflits
La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.
0 commentaire