Git Tutorial - Fusionner des branches

  1. Avance rapide git merge (fusion)
  2. Fusion récursive de git
  3. Résoudre les conflits

Nous allons apprendre à fusionner des branches et aussi à gérer les conflits s’il y en a.

Dans le dernier tutoriel, nous avons créé une nouvelle branche pour travailler sur de nouvelles fonctionnalités que nous ne voulons pas gâcher la branche master.

Une fois que nous avons créé ces nouvelles branches et que nous sommes satisfaits des nouvelles fonctionnalités, nous devons la fusionner à nouveau dans la branche master. Ainsi, lorsque nous publierons le code de la prochaine version, la nouvelle fonctionnalité sera également incluse.

Avance rapide git merge (fusion)

Disons que nous sommes contents des changements dans la branche new_test_branch et que nous allons la fusionner avec la branche master.

  • Regardez la branche master.
    $ git checkout master
    
  • Fusionner la branche avec le master.
    $ git merge new_test_branch
    Updating 5fef94e..e7a7e81
    	Fast-forward
    	test3.txt | 3 ++-
    	1 file changed, 2 insertions(+), 1 deletion(-)
    

Nous avons pris la fonctionnalité de la branche new_test_branch et l’avons fusionnée dans cette branche master.

Le Fast-forward montré dans le message après la fusion signifie que git fait une avance rapide jusqu’aux changements de code que nous avons fait dans la branche parce que dans le temps entre le branchement et la fusion dans master, nous n’avons pas réellement fait de changements dans la branche master.

Fusion récursive de git

Avant de démontrer cette différente git merge, nous devons créer deux branches test_branch_A et test_branch_B et leur faire des changements différents. Ensuite, nous fusionnerons la test_branch_A avec la branche master.

Maintenant, nous allons fusionner test_branch_B avec la branche master.

$ git merge test_branch_B
Merge made by the 'recursive' strategy.
 test1_rename.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

La différence entre cette fusion et la fusion fast-forward est que la fusion est faite par la stratégie récursive parce que le code de cette branche n’a pas la fonctionnalité test_branch_A. En d’autres termes, la branche master a changé après que la branche test_branch_B soit créée.

Maintenant, master est à jour avec ces deux fonctionnalités, et peu importe que nous ayons travaillé dessus en même temps, les différentes personnes qui les font avec les deux les fusionnent et tout va bien.

Résoudre les conflits

Ce que nous avons modifié dans deux branches de test n’a pas de conflit, mais que faire s’il y a des conflits quand vous fusionnez certaines branches vers le master ?

Créons deux branches test_branch_C et test_branch_D, puis ajoutons le texte The letter should be C au fichier test3.txt dans la branche test_branch_C et ajoutons le texte The letter should be D au fichier test3.txt dans la branche test_branch_D.

Ensuite nous fusionnons le fichier test_branch_C dans la branche master.

Maintenant, nous allons fusionner test_branch_D dans la branche master,

$ git merge test_branch_D
Auto-merging test3.txt
CONFLICT (content): Merge conflict in test3.txt
Automatic merge failed; fix conflicts and then commit the result.

Vous pouvez voir ici qu’il n’a pas pu être fusionné avec succès car il détecte le conflit dans le fichier test3.txt. Nous devons résoudre manuellement le conflit en éditant le fichier en conflit.

Le fichier test3.txt montre le conflit comme

<<<<<<< HEAD
The letter should be C
=======
The letter should be D
>>>>>>> test_branch_D

Le texte entre HEAD et ======= est le texte dans la branche master qui vient de la branche fusionnée test_branch_C, qui diffère du texte dans la branche à émerger test_branch_D.

Vous devez choisir quel texte doit rester dans la branche master, et effacer tous les symboles comme <<<<< et >>>>>>.

Disons que le texte ajouté doit être The letter should be D. Nous mettons à jour la zone de conflit pour qu’elle soit The letter should be D.

Après avoir résolu le conflit, nous pourrions commettre le conflit résolu en utilisant git commit.

comments powered by Disqus