Voici 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'
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
:
$ 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 branchehello-cow
. - Après la fusion, l’état de la branche
master
est identique au dernier commit sur la branchehello-cow
, ce qui explique leFast-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.
0 commentaire