Créer des branches dans git est plus simple que vous le pensez. C’est rapide (40 caractères à écrire dans un fichier), simple (une commande pour créer une branche), et efficace ( aucune copie intégrale de l’état courant de votre travil n’est créé). Les bracnhes que vous créer n’ont pas à exister dans le dépôt distant, vous pouvez donc les utiliser pour tester vos nouvelles fonctionnalités ou corrections de bugs sans casser ce qui a déjà été fait. L’article Pourquoi Git est meilleur que X décrit les arguments suivants :
Git vous permettra d’avoir plusieurs branches en local qui peuvent être complétement indépendantes les unes des autres et la création, la fusion et la suppression de ces développements ne prendra que quelques secondes. […] Git rends ce processsus incroyablement simple et cela change la manière de travailler de la plupart des développeurs une fois qu’ils l’ont appris.
Tout cela est parfait mais vous pouvez encore être effrayé d’utiliser les branches à cause des mauvais souvenirs laissés par la manière dont votre système de gestion de version gérait cela (si il le gérait). Ne vous en faite pas, nous allons voir un exemple simple de branchement et de fusion, et de résolution de conflits de version.
Je travaille à nouveau sur le dépôt jekyll. Je vais créer une nouvelle branche, y faire des changements et incorporer les changements dans la branche master initiale.
$ git checkout -b fixes Switched to a new branch "fixes" $ vim lib/jekyll/core_ext.rb $ git commit -am "Adding cutoff method to String" Created commit 670e353: Adding cutoff method to string 1 files changed, 15 insertions(+), 1 deletions(-) $ git checkout master Switched to branch "master" $ git merge fixes Updating e53ac7a..670e353 Fast forward lib/jekyll/core_ext.rb | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletions(-)
Et c’est tout ! Si nous voulions supprimer cette branche, un git branch -d fixes
la supprimerai. Comme il est si facile de créer une branche et de travailler dessus indépendamment, intégrer cette possibilité dans votre processus de travail est d’une grande utilité. Par exemple, Josh Susser a écrit un bon article sur son utilisation des branches pour travailler sur des scénarios utilisateurs.
Ceci n’est qu’un exemple simple de fusion avec bon en avant, pas forcément représentatif de la réalité. Regardons ensemble un exemple de modification effectuée sur la même ligne d’un fichier présent dans ma branche master et ma noubvelle branche et voyons comment Git réagit :
$ vim lib/jekyll/core.rb $ git commit -am "Causing a merge on purpose" Created commit 8aba87e: Causing a merge on purpose 1 files changed, 2 insertions(+), 2 deletions(-) $ git checkout -b conflicts $ vim lib/jekyll/core.rb $ git commit -am "Changing cutoff default" Created commit 6041ddd: Changing cutoff default 1 files changed, 1 insertions(+), 1 deletions(-) $ git checkout master Switched to branch "master" $ git merge conflicts Auto-merged lib/jekyll/core_ext.rb CONFLICT (content): Merge conflict in lib/jekyll/core_ext.rb Automatic merge failed; fix conflicts and then commit the result.
En ouvrant ce fichier, on découvre que git nous montre les différences de chaque versions de ce bout de code :
Un git status
nous montre qu’un conflit de version est toujours présent. Comme nous voulons garder la version que je viens de créer, il suffit de supprimer les lignes que git a crée et l’ancienne version. Puis ajouter les fichiers à l’index (add
) et commiter (commit
) comme d’habitude, et votre conflit de fusion est résolu !
$ git status # On branch master # # Changed but not updated: # (use "git add <file>..." to update what will be committed) # # unmerged: lib/jekyll/core_ext.rb # $ vim lib/jekyll/core.rb $ git commit -am "Fixing conflict!" Created commit 9c8e9fd: Fixing conflict!
Cette commande crée un commit spécial qui a deux commits parents pour chacune des branches que nous avons fusionnés :
$ git show HEAD commit 9c8e9fd335381fe6a97708f7b3cd1d5acf670d2d Merge: 8aba87e... 6041ddd... Author: Nick Quaranto <nick@quaran.to> Date: Sun Jan 25 13:22:03 2009 -0500 Fixing conflict!
D’autres astuces nous montrerons comment utiliser des programmes d’aide pour simplifier cette opération, comme git-mergetool et gitk --merge
. Si vous connaisser un bon didacticiel pour ce sujet ou une autre manière de faire des fusions, Proposer une astuce ! En attendant, jeter un cop d’oeil au gitcast de Scott Chacon sur ce sujet ou le Git Community Book’s guide. si vous voulez plus d’information sur la sujet.