Le fast-forward merge
Dans le précédent atelier pratique, nous avons abordé l'intégration des branches dans notre workflow. Aujourd'hui nous allons voir en détail comment fusionner toutes ces branches, et nous allons commencer par le cas de figure le plus simple. En effet, en fonction de l'historique de vos commits, l'opération de fusion peut s'avérer triviale ou alors un petit peu plus complexe.
Une branche à proprement parler est simplement une référence à un commit. Nous avons vu que chaque fois que nous basculons vers une autre branche, Git réorganise le contenu de notre répertoire de travail de manière à ce qu'il corresponde au dernier commit effectué sur la branche en question. Or, tôt ou tard nous aimerions bien retrouver tous ces fichiers dans la même branche.
Quelle branche d'ailleurs ? Rappelez-vous que lorsque vous initialisez un
dépôt Git, vous démarrez toujours sur une branche nommée master. Puisque
cette branche est créée par défaut, elle est toujours là. Une manière de
procéder, c'est tout simplement d'utiliser cette branche master pour contenir
la trame principale de notre projet.
-
On pourrait appeler cette branche principale la branche d'intégration (integration branch) dans le sens où l'on y intègre petit à petit le travail développé dans les autres branches.
-
Ces autres branches constitueront autant de branches thématiques (topic branches) ou branches de fonctionnalité (feature branches). Leur durée de vie est limitée, et elles servent essentiellement à une chose et une seule, comme ajouter une fonctionnalité ou corriger un bug.
Fusionner des branches consiste ni plus ni moins à rassembler de façon
cohérente ce travail effectué dans différentes branches. Git dispose d'une
commande faite pour cette tâche : git merge.
L'opération de fusion concerne deux branches :
-
la branche courante sur laquelle vous vous trouvez (proposer)
-
la branche externe que vous souhaitez intégrer à la branche courante (proposee)
La fusion par la pratique
La meilleure façon d'intégrer le concept de fusion, c'est de mettre les mains dans le cambouis. Pour nous simplifier la vie, nous allons reprendre l'exemple de notre précédent atelier pratique. Cette fois-ci nous allons procéder à la fusion des branches que nous créons, en partant du cas de figure le plus simple.
Initialisez un dépôt Git :
$ cd ~/formation-git/
$ mkdir atelier-13
$ cd atelier-13/
$ git init
...
Initialized empty Git repository in .../formation-git/atelier-13/.git/
Créez un fichier hello.sh et éditez-le comme ceci :
Rendez le fichier exécutable et testez-le :
Ajoutez le fichier à l'index de Git et validez-le :
$ git add hello.sh
$ git commit -m "Commit initial"
[master (root-commit) 7dc3c33] Commit initial
1 file changed, 5 insertions(+)
create mode 100755 hello.sh
Basculez vers la branche nouvellement créée hello-cow :
D'une pierre deux coups
Ici j'ai introduit une petite nouveauté. Jusqu'ici nous avons utilisé git
branch pour créer une nouvelle branche et git switch pour basculer vers
cette branche. La commande ci-dessus permet de combiner les deux
opérations.
Créez un script hello-cow.sh et éditez-le comme ceci :
#!/bin/bash
#
# hello-cow.sh
if [ -x /usr/bin/cowsay ]
then
cowsay "Hello !"
else
echo "Hello !"
fi
Rendez le script exécutable et testez-le :
$ chmod +x hello-cow.sh
$ ./hello-cow.sh
_________
< Hello ! >
---------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Ajoutez le script à Git et validez-le :
$ git add hello-cow.sh
$ git commit -m "Premier jet avec une vache"
[hello-cow 9d9f287] Premier jet avec une vache
1 file changed, 10 insertions(+)
create mode 100755 hello-cow.sh
Jusqu'ici, rien de nouveau sous le soleil. Nous nous retrouvons avec une
branche hello-cow qui contient le script hello-cow.sh ainsi que le script
inital hello.sh :
La branche master contient le seul script initial hello.sh :
Un coup d'avance rapide
À ce stade je me dis que mon script hello-cow.sh me satisfait, et j'aimerais
bien l'intégrer à la branche master. Pour ce faire, je vais utiliser la
commande merge. Avant de la lancer, vérifiez si vous vous trouvez bien sur la
branche master :
$ git branch
hello-cow
* master
$ git merge hello-cow
Updating 7dc3c33..9d9f287
Fast-forward
hello-cow.sh | 10 ++++++++++
1 file changed, 10 insertions(+)
create mode 100755 hello-cow.sh
Quelques remarques sur ce que nous venons de faire :
-
La branche
masterest notre branche d'intégration ici. -
La branche
hello-cowest la branche thématique (ou branche de fonctionnalité) que nous intégrons. -
Notez que la branche
mastern'a pas été modifiée depuis que nous avons créé la branchehello-cow. -
Après la fusion, l'état de la branche
masterest identique au dernier commit sur la branchehello-cow, ce qui explique leFast-forwardqui s'affiche lors de la fusion des deux branches. -
Un fast-forward merge correspond à une fusion simple où l'une des deux branches exécute un ou plusieurs bonds en avant, en fonction du nombre de commits sur la branche thématique.
À présent, la branche master contient bien mes deux scripts :
La branche hello-cow ne me sert plus à rien. Je peux donc la supprimer :
Afficher l'aide de Git
À ce stade, vous commencez peut-être à vous inquiéter vaguement face au nombre grandissant de commandes et d'options à mémoriser. Avant d'aller plus loin, je vous montre donc l'utilisation de l'aide intégrée de Git.
Un peu plus haut, j'ai supprimé une branche grâce à la commande git branch
--delete. Admettons que j'aie un doute sur la syntaxe exacte à utiliser, je
peux afficher les options de la commande branch comme ceci :
$ git branch --help
...
OPTIONS
-d, --delete
Delete a branch. The branch must be fully merged in its upstream branch,
or in HEAD if no upstream was set with --track or --set-upstream-to.
L'option -h me permet d'afficher des infos plus compactes :
À vous de jouer !
-
Créez un répertoire
formation-git/atelier-14et initialisez un dépôt Git dans ce répertoire. -
Créez un fichier
Recettes.mdqui contient le titre# Recettes. -
Ajoutez ce fichier à la branche
master. -
Créez une branche
bolognaiseet basculez vers cette branche. -
Allez sur marmiton.org et cherchez une recette de sauce bolognaise.
-
Copiez cette recette telle quelle dans un fichier
Bolognaise.md. -
Ajoutez ce fichier à la branche
bolognaiseavec le message « Premier jet sauce bolognaise ». -
Éditez le fichier avec quelques petites améliorations visuelles et/ou culinaires.
-
Enregistrez vos modifications et validez-les avec le message « Peaufinage sauce bolognaise ».
-
Visualisez mentalement ou sur un bout de papier l'évolution de vos deux branches.
-
Retournez dans la branche
master. -
Fusionnez les deux branches.
-
Supprimez la branche
bolognaise.
