FR: some more mispellings.
[gitmagic/gitmagic.git] / fr / grandmaster.txt
blob4ee69c0028c61a888fac172c1ef1587f11df29cf
1 // -*- mode: doc; mode: flyspell; coding: utf-8; fill-column: 79; -*-
2 == La maîtrise de Git ==
4 À ce stade, vous devez être capable de parcourir les pages de *git help* et
5 comprendre presque tout (en supposant que vous lisez l'anglais). En revanche,
6 retrouver la commande exacte qui résoudra un problème précis peut être
7 fastidieux. Je peux sans doute vous aider à gagner un peu de temps : vous
8 trouverez ci-dessous quelques-unes des recettes dont j'ai déjà eu besoin.
10 === Publication de sources ===
12 Dans mes projets, Git gère exactement tous les fichiers que je veux placer dans
13 une archive afin de la publier. Pour créer une telle archive, j'utilise :
15  $ git archive --format=tar --prefix=proj-1.2.3/ HEAD
17 === Gérer le changement ===
19 Indiquer à Git quels fichiers ont été ajoutés, supprimés ou renommés est
20 parfois pénible pour certains projets. À la place, vous pouvez faire :
22  $ git add .
23  $ git add -u
25 Git cherchera les fichiers du dossier courant et gérera tous les détails tout
26 seul. En remplacement de la deuxième commande 'add', vous pouvez utiliser `git
27 commit -a` pour créer un nouveau commit directement. Lisez *git help ignore*
28 pour savoir comment spécifier les fichiers qui doivent être ignorés.
30 Vous pouvez effectuer tout cela en une seule passe grâce à :
32  $ git ls-files -d -m -o -z | xargs -0 git update-index --add --remove
34 Les options *-z* et *-0* empêchent les effets secondaires imprévus dûs au noms
35 de fichiers contenant des caractères étranges.  Comme cette commande ajoutent
36 aussi les fichiers habituellement ignorés, vous voudrez sûrement utiliser les
37 options `-x` ou `-X`.
39 === Mon commit est trop gros ! ===
41 Avez-vous négligé depuis longtemps de faire un commit ? Avez-vous codé
42 furieusement et tout oublié de la gestion de versions jusqu'à présent ?
43 Faites-vous plein de petits changements sans rapport entre eux parce que c'est
44 votre manière de travailler ?
46 Pas de soucis. Faites :
48  $ git add -p
50 Pour chacune des modifications que vous avez faites, Git vous montrera le bout
51 de code qui a changé et vous demandera si elle doit faire partie du prochain
52 commit. Répondez par "y" (oui) ou par "n" (non). Vous avez aussi d'autres
53 options comme celle vous permettant de reporter votre décision ; tapez "?" pour
54 en savoir plus.
56 Une fois satisfait, tapez :
58  $ git commit
60 pour faire un commit incluant exactement les modifications qui vous avez
61 sélectionnées (les modifications indexées). Soyez certain de ne pas utiliser
62 l'option *-a* sinon Git fera un commit incluant toutes vos modifications.
64 Que faire si vous avez modifié de nombreux fichiers en de nombreux endroits ?
65 Vérifier chaque modification individuellement devient alors rapidement
66 frustrant et abrutissant. Dans ce cas, utilisez la commande *git add -i* dont
67 l'interface est moins facile mais beaucoup plus souple. En quelques touches
68 vous pouvez ajouter ou retirer de votre index (voir ci-dessous) plusieurs
69 fichiers d'un seul coup mais aussi valider ou non chacune des modifications
70 individuellement pour certains fichiers. Vous pouvez aussi utiliser en
71 remplacement la commande *git commit \--interactive* qui effectuera un commit
72 automatiquement quand vous aurez terminé.
74 === L'index : l'aire d'assemblage ===
76 Jusqu'ici nous avons réussi à éviter de parler du fameux 'index' de Git mais
77 nous devons maintenant le présenter pour mieux comprendre ce qui
78 précède. L'index est une aire d'assemblage temporaire. Git ne transfert que
79 très rarement de données depuis votre dossier de travail directement vers votre
80 historique. En fait, Git copie d'abord ces données dans l'index puis il copie
81 toutes ces données depuis l'index vers leur destination finale.
83 Un *commit -a*, par exemple, est en fait un processus en deux temps. La
84 première étape consiste à construire dans l'index un instantané de l'état
85 actuel de tous les fichiers suivis par Git. La seconde étape enregistre cet
86 instantané de manière permanente dans l'historique. Effectuer un commit sans
87 l'option *-a* réalise uniquement cette deuxième étape et cela n'a de sens
88 qu'après avoir effectué des commandes qui change l'index, telle que *git add*.
90 Habituellement nous pouvons ignorer l'index et faire comme si nous échangions
91 directement avec l'historique. Dans certaines occasions, nous voulons un
92 contrôle fin et nous gérons donc l'index. Nous plaçons dans l'index un
93 instantané de certaines modifications (mais pas toutes) et enregistrons de
94 manière permanente cet instantané soigneusement construit.
96 === Ne perdez pas la tête ===
98 Le tag HEAD est comme un curseur qui pointe habituellement vers le tout dernier
99 commit et qui avance à chaque commit. Certaines commandes Git vous permettent
100 de le déplacer. Par exemple :
102  $ git reset HEAD~3
104 déplacera HEAD trois commits en arrière. À partir de là, toutes les commandes
105 Git agiront comme si vous n'aviez jamais fait ces trois commits, même si vos
106 fichier restent dans leur état présent. Voir les pages d'aide pour quelques
107 usages intéressants.
109 Mais comment faire pour revenir vers le futur ? Les commits passés ne savent
110 rien du futur.
112 Si vous connaissez l'empreinte SHA1 du HEAD original, faites alors :
114  $ git reset 1b6d
116 Mais que faire si vous ne l'avez pas regardé ? Pas de panique : pour des
117 commandes comme celle-ci, Git enregistre la valeur originale de HEAD dans un
118 tag nommé ORIG_HEAD et vous pouvez revenir sain et sauf via :
120  $ git reset ORIG_HEAD
122 === Chasseur de tête ===
124 Peut-être que ORIG_HEAD ne vous suffit pas. Peut-être venez-vous de vous
125 apercevoir que vous avez fait une monumentale erreur et que vous devez revenir
126 à une ancienne version d'une branche oubliée depuis longtemps.
128 Par défaut, Git conserve un commit au moins deux semaine même si vous avez
129 demandé à Git de détruire la branche qui le contient. La difficulté consiste à
130 retrouver l'empreinte appropriée. Vous pouvez toujours explorer les différentes
131 valeurs d'empreinte trouvées dans `.git/objects` et retrouver celle que vous
132 cherchez par essais et erreurs. Mais il existe un moyen plus simple.
134 Git enregistre l'empreinte de chaque commit qu'il traite dans `.git/logs`. Le
135 sous-dossier `refs` contient l'historique de toute l'activité de chaque
136 branche alors que le fichier `HEAD` montre chaque valeur d'empreinte que HEAD a
137 pu prendre. Ce dernier peut donc servir à retrouver les commits d'une branche
138 qui a été accidentellement élaguée.
140 La commande reflog propose une interface sympa vers ces fichiers de
141 log. Essayez:
143   $ git reflog
145 Au lieu de copier/coller une empreinte listée par reflog, essayez :
147  $ git checkout "@{10 minutes ago}"
149 Ou basculez vers le cinquième commit précédemment visité via :
151  $ git checkout "@{5}"
153 Voir la section ``Specifying Revisions'' de *git help rev-parse* pour en savoir
154 plus.
156 Vous pouvez configurer une plus longue période de rétention pour les commits
157 condamnés. Par exemple :
159   $ git config gc.pruneexpire "30 days"
161 signifie qu'un commit effacé ne le sera véritablement qu'après 30 jours et
162 lorsque $git gc* tournera.
164 Vous pouvez aussi désactiver le déclenchement automatique de *git gc* :
166   $ git config gc.auto 0
168 auquel cas les commits ne seront véritablement effacés que lorsque vous
169 lancerez *git gc* manuellement.
171 === Construire au-dessus de Git ===
173 À la manière UNIX, la conception de Git permet son utilisation comme un
174 composant de bas niveau d'autres programmes tels que des interfaces graphiques
175 ou web, des interfaces en ligne de commandes alternatives, des outils de
176 gestion de patch, des outils d'importation et de conversion, etc. En fait,
177 certaines commandes Git sont de simples scripts s'appuyant sur les commandes de
178 base, comme des nains sur des épaules de géants. Avec un peu de bricolage, vous
179 pouvez adapter Git à vos préférences.
181 Une astuce facile consiste à créer des alias Git pour raccourcir les commandes
182 que vous utilisez le plus fréquemment :
184   $ git config --global alias.co checkout
185   $ git config --global --get-regexp alias  # affiche les alias connus
186   alias.co checkout
187   $ git co foo                              # identique à 'git checkout foo'
189 Une autre astuce consiste à intégrer le nom de la branche courante dans votre
190 prompt ou dans le titre de la fenêtre. L'invocation de :
192   $ git symbolic-ref HEAD
194 montre le nom complet de la branche courante. En pratique, vous souhaiterez
195 probablement enlever "refs/heads/" et ignorer les erreurs :
197   $ git symbolic-ref HEAD 2> /dev/null | cut -b 12-
199 Le sous-dossier +contrib+ de Git est une mine d'outils construits au-dessus de
200 Git. Un jour, certains d'entre eux pourraient être promus au rang de commandes
201 officielles. Dans Debian et Ubuntu, ce dossier est
202 +/usr/share/doc/git-core/contrib+.
204 L'un des plus populaires de ces scripts est +workdir/git-new-workdir+. Grâce à
205 des liens symboliques intelligents, ce script crée un nouveau dépôt dont
206 l'historique est partagé avec le dépôt original.
208   $ git-new-workdir un/existant/depot nouveau/repertoire
210 Le nouveau dossier et ses fichiers peuvent être vus comme un clone, sauf que
211 l'historique est partagé et que les deux arbres des versions restent
212 automatiquement synchrones. Nul besoin de merge, push ou pull.
214 === Audacieuses acrobaties  ===
216 À ce jour, Git fait tout son possible pour que l'utilisateur ne puisse pas
217 effacer accidentellement des données. Mais si vous savez ce que vous faites,
218 vous pouvez passer outre les garde-fous des principales commandes.
221 *Checkout* : des modifications non intégrées (via commit) peuvent causer
222 l'échec d'un checkout. Pour détruire vos modifications et réussir quoi qu'il
223 arrive un checkout d'un commit donné, utilisez l'option d'obligation :
225   $ git checkout -f HEAD^
227 Inversement, si vous spécifiez des chemins particuliers pour un checkout alors
228 il n'y a pas de garde-fous. Le contenu des chemins est silencieusement
229 réécrit. Faites attention lorsque vous utilisez un checkout de cette manière.
231 *Reset* : un reset échoue aussi en présence de modifications non
232 intégrées. Pour passer outre, faites :
234   $ git reset --hard 1b6d
236 *Branch* : la suppression de branches échoue si cela implique la perte de
237 certains commits. Par forcer la suppression, tapez :
239   $ git branch -D branche_morte  # à la place de -d
241 De manière similaire, une tentative visant à renommer une branche existante
242 vers le nom d'une autre branche échoue si cela amène la perte de commits. Pour
243 forcer le changement de nom, tapez :
245   $ git branch -M source target  # à la place de -m
247 Contrairement à checkout et reset, ces deux dernières commandes n'effectuent
248 pas la suppression des informations immédiatement. Les commits destinés à
249 disparaître sont encore disponibles dans le sous-dossier .git et peuvent encore
250 être retrouvés grâce aux empreintes appropriées tel que retrouvées dans
251 `.git/logs` (voir "Chasseur de tête" ci-dessus). Par défaut, ils sont conservés
252 au moins deux semaines.
254 *Clean* : certaines commandes Git refusent de s'exécuter pour ne pas
255 écraser des fichiers non suivis. Si vous êtes certain que tous ces fichiers et
256 dossiers peuvent être sacrifiés alors effacez-les sans pitié via :
258   $ git clean -f -d
260 Ensuite, la commande trop prudente fonctionnera !
262 === Se prémunir des commits erronés ===
264 Des erreurs stupides encombrent mes dépôts. Les plus effrayantes sont dues à
265 des fichiers manquants car oubliés lors des *git add*. D'autres erreurs moins
266 graves concernent les espaces blancs inutiles ou les conflits de fusion non
267 résolus : bien qu'inoffensives, j'aimerais qu'elles n'apparaissent pas dans les
268 versions publiques.
270 Si seulement je m'en étais prémuni en utilisant un _hook_ (un crochet) pour
271 m'alerter de ces problèmes :
273  $ cd .git/hooks
274  $ cp pre-commit.sample pre-commit  # Vieilles versions de Git : chmod +x pre-commit
276 Maintenant Git empêchera un commit s'il détecte des espace inutiles ou s'il
277 reste des conflits de fusion non résolus.
279 Pour gérer ce guide, j'ai aussi ajouté les lignes ci-dessous au début de mon
280 hook *pre-commit* pour me prémunir de mes inattentions :
282  if git ls-files -o | grep '\.txt$'; then
283    echo FAIL! Untracked .txt files.
284    exit 1
285  fi
287 Plusieurs opération de Git acceptent les hooks ; voir *git help hooks*. Nous
288 avons déjà utilisé le hook *post-update* lorsque nous avons parlé de Git
289 au-dessus de HTTP. Celui-ci se déclenche à chaque mouvement de HEAD. Le script
290 d'exemple post-update met à jour les fichiers Git nécessaires à une
291 communication au-dessus de transports agnostiques tels que HTTP.
293 // LocalWords:  doc flyspell coding utf fill-column Git git help tar prefix add
294 // LocalWords:  HEAD ls-files xargs update-index remove Faites-vous staged tag
295 // LocalWords:  reset commits SHA ORIG venez-vous refs reflog log checkout
296 // LocalWords:  ago Specifying Revisions rev-parse config gc.pruneexpire days
297 // LocalWords:  gc gc.auto run d'UNIX web patch alias.co get-regexp co foo cut
298 // LocalWords:  symbolic-ref heads contrib Debian Ubuntu workdir repertoire cd
299 // LocalWords:  git-new-workdir merge push hard Branch branch target Clean hook
300 // LocalWords:  effacez-les clean qu'inoffensives hooks cp pre-commit.sample
301 // LocalWords:  pre-commit chmod grep txt then echo FAIL Untracked post-update
302 // LocalWords:  HTTP