GitVoici 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.

AstuceNous 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 'recursive' 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 branche master, mais cette branche a été modifiée depuis.
  • Les branches master et hello-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.

AstucePour 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.

Métro Paris

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-14
$ cd atelier-14/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.

 

Catégories : Formation

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *