GitVoici le neuvième volet de la formation Git. Dans mon précédent article nous avons abordé l’intégration des branches dans notre flux de travail. 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 article. 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 /home/kikinovak/formation-git/atelier-13/.git/

Créez un fichier hello.sh et éditez-le comme ceci :

#!/bin/bash
#
# hello.sh

echo "Hello !"

Rendez le fichier exécutable et testez-le :

$ chmod +x hello.sh
$ ./hello.sh
Hello !

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 :

$ git switch --create hello-cow
Switched to a new branch 'hello-cow'

AstuceIci 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 :

$ git branch
* hello-cow
  master
$ ls
hello-cow.sh  hello.sh

La branche master contient le seul script initial hello.sh :

$ git switch master
Switched to branch 'master'
$ ls
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 master est notre branche d’intégration ici.
  • La branche hello-cow est la branche thématique (ou branche de fonctionnalité) que nous intégrons.
  • Notez que la branche master n’a pas été modifiée depuis que nous avons créé la branche hello-cow.
  • Après la fusion, l’état de la branche master est identique au dernier commit sur la branche hello-cow, ce qui explique le Fast-forward qui 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 :

$ git branch
  hello-cow
* master
$ ls
hello-cow.sh  hello.sh

La branche hello-cow ne me sert plus à rien. Je peux donc la supprimer :

$ ls
hello-cow.sh  hello.sh
$ git branch --delete hello-cow 
Deleted branch hello-cow (was 9d9f287).

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 :

$ git branch -h
...
  -d, --delete          delete fully merged branch

Exercice

  • Créez un répertoire formation-git/atelier-14 et initialisez un dépôt Git dans ce répertoire.
  • Créez un fichier Recettes.md qui contient le titre # Recettes.
  • Ajoutez ce fichier à la branche master.
  • Créez une branche bolognaise et 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 bolognaise avec 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.

Lire la suite : Le merge commit


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 *