Merge pull request #26 from aaferrari/master
[gitmagic.git] / fr / branch.txt
blob8d0478710932ee696a2dcbcd8a82b67f091736ed
1 // -*- mode: doc; mode: flyspell; coding: utf-8; fill-column: 79; -*-
2 == La sorcellerie des branches ==
4 Des branchements et des fusions quasi-instantanés sont les fonctionnalités les
5 plus puissantes qui font de Git un vrai tueur.
7 *Problème* : des facteurs externes amènent nécessairement à des changements de
8 contexte. Un gros bug se manifeste sans avertissement dans la version
9 déployée. La date limite pour une fonctionnalité particulière est avancée. Un
10 développeur qui vous aidait pour une partie clé du projet n'est plus
11 disponible. Bref, en tous cas, vous devez brusquement arrêter la tâche en cours
12 pour vous focaliser sur une tâche tout autre.
14 Interrompre votre réflexion peut être nuisible à votre productivité et le
15 changement de contexte amène encore plus de perte. Avec un système de gestion
16 de versions centralisé, il faudrait télécharger une nouvelle copie de travail
17 depuis le serveur central. Un système de gestion de versions décentralisé est
18 bien meilleur puisqu'il peut cloner localement la version voulue.
20 Mais un clone implique encore la copie de tout le dossier de travail ainsi que
21 de l'historique complet jusqu'au point voulu. Même si Git réduit ce coût grâce
22 aux fichiers partagés et au liens matériels, les fichiers du projet doivent
23 tout de même être entièrement recréés dans le nouveau dossier de travail.
25 *Solution* : dans ce genre de situations, Git offre un outil bien meilleur
26 puisque plus rapide et moins consommateur d'espace disque : les branches.
28 Grâce à un mot magique, les fichiers de votre dossier se transforment d'une
29 version à une autre. Cette transformation peut être bien plus qu'un simple
30 voyage dans l'historique. Vos fichiers peuvent se transformer de la dernière
31 version stable vers une version expérimentale, vers la version courante de
32 développement, vers la version d'un collègue, etc.
34 === La touche du chef ===
36 N'avez-vous jamais joué à l'un de ces jeux qui, à l'appui d'une touche
37 particulière (la ``touche du chef''), affiche instantanément une feuille de
38 calcul ? Ceci vous permet de cacher votre écran de jeu dès que le chef arrive.
40 Dans un dossier vide : 
42  $ echo "Je suis plus intelligent que mon chef." > myfile.txt
43  $ git init
44  $ git add .
45  $ git commit -m "Commit initial"
47 Vous venez de créer un dépôt Git qui gère un fichier contenant un
48 message. Maintenant tapez :
50  $ git checkout -b chef  # rien ne semble avoir changé
51  $ echo "Mon chef est plus intelligent que moi." > myfile.txt
52  $ git commit -a -m "Un autre commit"
54 Tout se présente comme si vous aviez réécrit votre fichier et intégrer (commit)
55 ce changement. Mais ce n'est qu'une illusion. Tapez :
57  $ git checkout master  # bascule vers la version originale du fichier
59 et ça y est ! Le fichier texte est restauré. Et si le chef repasse pour
60 regarder votre dossier, tapez :
62  $ git checkout chef  # bascule vers la version visible par le chef
64 Vous pouvez basculer entre ces deux versions autant de fois que voulu, et
65 intégrer (commit) vos changements à chacune d'elles indépendamment.
67 === Travail temporaire ===
69 [[branch]] Supposons que vous travailliez sur une fonctionnalité et que, pour
70 une raison quelconque, vous ayez besoin de revenir trois versions en arrière
71 afin d'ajouter temporairement quelques instructions d'affichage pour voir
72 comment quelque chose fonctionne. Faites :
74  $ git commit -a
75  $ git checkout HEAD~3
77 Maintenant vous pouvez ajouter votre code temporaire là où vous le
78 souhaitez. Vous pouvez même intégrer (commit) vos changements. Lorsque vous
79 avez terminé, tapez :
81  $ git checkout master
83 pour retourner à votre travail d'origine. Notez que tous les changement non
84 intégrés sont définitivement perdus (NdT : les changements intégrés via commit
85 sont conservés quelques jours et sont accessibles en connaissant leur empreinte
86 SHA1).
88 Que faire si vous voulez nommer ces changements temporaires ? Rien de plus
89 simple :
91  $ git checkout -b temporaire
93 et faites un commit avant de rebasculer vers la branche master. Lorsque vous
94 souhaitez revenir à vos changements temporaires, tapez simplement :
96  $ git checkout temporaire
98 Nous aborderons la commande _checkout_ plus en détail lorsque nous parlerons du
99 chargement d'anciens états. Mais nous pouvons tout de même en dire quelques
100 mots : les fichiers sont bien amenés dans l'état demandé mais en quittant la
101 branche master. À ce moment, tout commit poussera nos fichiers sur une route
102 différente, qui pourra être nommée plus tard.
104 En d'autres termes, après un checkout vers un état ancien, Git nous place
105 automatiquement dans une nouvelle branche anonyme qui pourra être nommée et
106 enregistrée grâce à *git checkout -b*.
108 === Corrections rapides ===
110 Vous travaillez sur une tâche particulière et on vous demande de tout laisser
111 tomber pour corriger un nouveau bug découvert dans la version `1b6d...` :
113  $ git commit -a
114  $ git checkout -b correction 1b6d
116 Puis quand vous avez corrigé le bug, saisissez :
118  $ git commit -a -m "Bug corrigé"
119  $ git checkout master
121 pour vous ramener à votre tâche originale. Vous pouvez même fusionner ('merge')
122 avec la correction de bug toute fraîche :
124  $ git merge correction
126 === Fusionner ===
128 Dans certains systèmes de gestion de versions, la création de branches est
129 facile mais les fusionner est difficile. Avec Git, la fusion est si simple que
130 vous n'y prêterez plus attention.
132 En fait, nous avons déjà rencontré la fusion. La commande *pull* ramène
133 ('fetch') une série de versions puis les fusionne ('merge') dans votre branche
134 courante. Si vous n'avez effectué aucun changement local alors la fusion est un
135 simple bon en avant (un _fast forward_), un cas dégénéré qui s'apparente au
136 rapatriement de la dernière version dans un système de gestion de versions
137 centralisé. Si vous avez effectué des changements locaux, Git les
138 fusionnera automatiquement et préviendra s'il y a des conflits.
140 Habituellement, une version à une seule 'version parente', qu'on appelle la
141 version précédente. Une fusion de branches entre elles produit une version avec
142 plusieurs parents. Ce qui pose la question suivante : à quelle version se
143 réfère `HEAD~10` ? Puisqu'une version peut avoir plusieurs parents, par quel
144 parent remonterons-nous ?
146 Il s'avère que cette notation choisit toujours le premier parent. C'est
147 souhaitable puisque la branche courante devient le premier parent lors d'une
148 fusion. Nous nous intéressons plus fréquemment aux changements que nous avons
149 faits dans la branche courante qu'à ceux fusionnés depuis d'autres branches.
151 Vous pouvez choisir un parent spécifique grâce à l'accent circonflexe. Voici,
152 par exemple, comment voir le log depuis le deuxième parent :
154  $ git log HEAD^2
156 Vous pouvez omettre le numéro pour le premier parent. Voici, par exemple,
157 comment voir les différences avec le premier parent ;
159  $ git diff HEAD^
161 Vous pouvez combiner cette notation avec les autres. Par exemple :
163  $ git checkout 1b6d^^2~10 -b ancien
165 démarre la nouvelle branche ``ancien'' dans l'état correspondant à 10 versions
166 en arrière du deuxième parent du premier parent de la version 1b6d.
168 === Workflow sans interruption ===
170 La plupart du temps dans un projet de réalisation matérielle, la seconde étape
171 du plan ne peut commencer que lorsque la première étape est terminée. Une
172 voiture en réparation reste bloquée au garage jusqu'à la livraison d'une
173 pièce. Le montage d'un prototype est suspendu en attendant la fabrication d'une
174 puce.
176 Les projets logiciels peuvent être similaires. La deuxième partie d'une
177 nouvelle fonctionnalité doit attendre que la première partie soit sortie et
178 testée. Certains projets exigent une validation de votre code avant son
179 acceptation, vous êtes donc obligé d'attendre que la première partie soit
180 validée avant de commencer la seconde.
182 Grâce aux branches et aux fusions faciles, vous pouvez contourner les règles et
183 travailler sur la partie 2 avant que la partie 1 soit officiellement
184 prête. Supposons que vous ayez terminé la version correspondant à la partie 1
185 et que vous l'ayez envoyée pour validation. Supposons aussi que vous soyez dans
186 la branche `master`. Alors, branchez-vous :
188  $ git checkout -b part2
190 Ensuite, travaillez sur la partie 2 et intégrez (via `commit`) vos changements
191 autant que nécessaire. L'erreur étant humaine, vous voudrez parfois revenir en
192 arrière pour effectuer des corrections dans la partie 1. Évidemment, si vous
193 êtes chanceux ou très bon, vous pouvez sauter ce passage.
195  $ git checkout master  # Retour à la partie 1
196  $ correction_des_bugs
197  $ git commit -a        # Intégration de la correction
198  $ git checkout part2   # Retour à la partie 2
199  $ git merge master     # Fusion de la correction.
201 Finalement, la partie 1 est validée.
203  $ git checkout master    # Retour à la partie 1
204  $ diffusion des fichiers # Diffusion au reste du monde !
205  $ git merge part2        # Fusion de la partie 2
206  $ git branch -d part2    # Suppression de la branche 'part2'.
208 À cet instant vous êtes à nouveau dans la branche `master` avec la partie 2
209 dans votre dossier de travail.
211 Il est facile d'étendre cette astuce à de nombreuses branches. Il est aussi
212 facile de créer une branche rétroactivement : imaginons qu'après 7 commits,
213 vous vous rendiez compte que vous auriez dû créer une branche. Tapez alors :
215  $ git branch -m master part2  # Renommer la branche "master" en "part2".
216  $ git branch master HEAD~7    # Recréer une branche "master" 7 commits en arrière.
218 La branche `master` contient alors uniquement la partie 1 et la branche `part2`
219 contient le reste ; nous avons créé `master` sans basculer vers elle car nous
220 souhaitons continuer à travailler sur `part2`. Ce n'est pas très
221 courant. Jusqu'à présent nous avions toujours basculé vers une branche dès sa
222 création, comme dans :
224  $ git checkout HEAD~7 -b master  # Créer une branche et basculer vers elle.
226 === Réorganiser le foutoir ===
228 Peut-être aimez-vous travailler sur tous les aspects d'un projet dans la même
229 branche. Vous souhaitez que votre travail en cours ne soit accessible qu'à
230 vous-même et donc que les autres ne puissent voir vos versions que lorsqu'elles
231 sont proprement organisées. Commencez par créer deux branches :
233   $ git branch propre       # Créer une branche pour les versions propres
234   $ git checkout -b foutoir # Créer et basculer vers une branche pour le foutoir
236 Ensuite, faites tout ce que vous voulez : corriger des bugs, ajouter des
237 fonctionnalités, ajouter du code temporaire et faites-en des versions autant
238 que voulu. Puis :
240   $ git checkout propre
241   $ git cherry-pick foutoir^^
243 applique les modifications de la version grand-mère de la version courante du
244 ``foutoir'' à la branche ``propre''. Avec les cherry-picks appropriés vous
245 pouvez construire une branche qui ne contient que le code permanent et où
246 toutes les modifications qui marchent ensemble sont regroupées.
248 === Gestion des branches ===
250 Pour lister toutes les branches, tapez :
252  $ git branch
254 Par défaut, vous commencez sur la branche nommée ``master''. Certains
255 préconisent de laisser la branche ``master'' telle quelle et de créer de
256 nouvelles branches pour vos propres modifications.
258 Les options *-d* et *-m* vous permettent de supprimer et renommer les
259 branches. Voir *git help branch*.
261 La branche ``master'' est une convention utile. Les autres supposent que votre
262 dépôt possède une telle branche et qu'elle contient la version officielle de
263 votre projet. Bien qu'il soit possible de renommer ou d'effacer cette branche
264 ``master'', il peut-être utile de respecter les traditions.
266 === Les branches temporaires ===
268 Après un certain temps d'utilisation, vous vous apercevrez que vous créez
269 fréquemment des branches éphémères toujours pour les mêmes raisons : elles vous
270 servent juste à sauvegarder l'état courant, vous permettant ainsi de revenir
271 momentanément à état précédent pour corriger un bug.
273 C'est exactement comme si vous zappiez entre deux chaînes de télévision. Mais
274 au lieu de presser deux boutons, il vous faut créer, basculer, fusionner et
275 supprimer des branches temporaires. Par chance, Git propose un raccourci qui
276 est aussi pratique que la télécommande de votre télévision :
278  $ git stash
280 Cela mémorise l'état courant dans un emplacement temporaire (un 'stash') et
281 restaure l'état précédent. Votre dossier courant apparaît alors exactement
282 comme il était avant que vous ne commenciez à faire des modifications et vous
283 pouvez corriger des bugs, aller rechercher (pull) une modification de dépôt
284 central ou toute autre chose. Lorsque vous souhaitez revenir à l'état mémorisé
285 dans votre 'stash', tapez :
287  $ git stash apply  # Peut-être faudra-t-il résoudre quelques conflits.
289 Vous pouvez avoir plusieurs 'stash' et les manipuler de différents
290 manières. Voir *git help stash*. Comme vous l'aurez deviné, pour faire ces
291 tours de magie, dans les coulisses Git gère des branches.
293 === Travailler comme il vous chante ===
295 Vous vous demandez sans doute si l'usage des branches en vaut la peine. Après
296 tout, des clones sont tout aussi rapides et vous pouvez basculer de l'un à
297 l'autre par un simple *cd* au lieu de commandes Git ésotériques.
299 Considérez les navigateurs Web. Pourquoi proposer plusieurs onglets ainsi que
300 plusieurs fenêtres ? Parce proposer les deux permet de s'adapter à une large
301 gamme d'utilisations. Certains préfèrent n'avoir qu'une seule fenêtre avec plein
302 d'onglets. D'autres font tout le contraire : plein de fenêtres avec un seul
303 onglet. D'autres encore mélangent un peu des deux.
305 Les branches ressemblent à des onglets de votre dossier de travail et les
306 clones ressemblent aux différents fenêtres de votre navigateur. Ces opérations
307 sont toutes rapides et locales. Alors expérimentez pour trouver la combinaison
308 qui vous convient. Git vous laisse travailler exactement comme vous le
309 souhaitez.
311 // LocalWords:  doc visual-line quasi-instantanés Git bug télécharger echo git
312 // LocalWords:  myfile.txt init add checkout master branch HEAD NdT SHA fetch
313 // LocalWords:  rebasculer commits merge fast forward bugs remonterons-nous log
314 // LocalWords:  diff Workflow branchez-vous aimez-vous faites-en cherry-pick cd
315 // LocalWords:  cherry-picks help zappiez stash apply faudra-t-il Web