Merge branch 'master' of https://github.com/matrig/gitmagic
[gitmagic.git] / fr / multiplayer.txt
blob63139c9198b4c19168f01823b9b6de278bbc2f40
1 // -*- mode: doc; mode: visual-line; mode: flyspell; coding: utf-8; -*-
2 == Git multijoueur ==
4 Au départ, j'utilisais Git pour un projet privé où j'étais le seul
5 développeur. Parmi toutes les commandes liées à la nature distribuée de Git, je
6 n'avais besoin que de *pull* et *clone* afin de disposer de mon projet en
7 différents lieux.
9 Plus tard, j'ai voulu publier mon code via Git et inclure des modifications de
10 plusieurs contributeurs. J'ai dû apprendre à gérer des projets avec de nombreux
11 développeurs à travers le monde. Heureusement c'est l'un des points forts de
12 Git et peut-être même sa _raison d'être_ (en français dans le texte).
14 === Qui suis-je ? ===
16 À chaque commit sont associés le nom et le mail de l'auteur, ceux qui sont
17 montrés par *git log*. Par défaut, Git utilise les valeurs fournies par le
18 système pour remplir ces champs. Pour les configurer explicitement, tapez :
20   $ git config --global user.name "John Doe"
21   $ git config --global user.email johndoe@example.com
23 Supprimer l'option `--global` pour que ces valeurs soient locales au dépôt courant.
25 === Git via SSH et HTTP ===
27 Supposez que vous ayez un accès SSH à un serveur Web sur lequel Git n'est pas
28 installé. Bien que ce soit moins efficace que le protocole natif, Git sait
29 communiquer par dessus HTTP.
31 Télécharger, compiler et installer Git sur votre compte et créer un dépôt dans
32 votre dossier web :
34  $ GIT_DIR=proj.git git init
35  $ cd proj.git
36  $ git --bare update-server-info
37  $ cp hooks/post-update.sample hooks/post-update
39 Avec les vieilles versions de Git, la commande de copie échoue et vous devez
40 faire :
42  $ chmod a+x hooks/post-update
44 Maintenant vous pouvez transmettre vos modifications via SSH depuis n'importe
45 lequel de vos clones :
47  $ git push web.server:/path/to/proj.git master
49 et n'importe qui peut récupérer votre projet grâce à :
51  $ git clone http://web.server/proj.git
53 === Git via n'importe quoi ===
55 Besoin de synchroniser des dépôts sans passer par un serveur ni même une
56 connexion réseau ? Besoin d'improviser dans l'urgence ? Nous avons déjà vu que
57 <<makinghistory, *git fast-export* et *git fast-import* savent convertir et
58 recréer un dépôt via un simple fichier>>. Nous pourrions utiliser des fichiers
59 de ce type pour assurer le transport entre des dépôts Git via n'importe quel
60 canal. Mais un outil plus puissant existe : *git bundle*.
62 L'émetteur crée un 'bundle' :
64  $ git bundle create monbundle HEAD
66 puis il transmet ce bundle, +monbundle+, à l'autre partie par n'importe quel
67 moyen : email, clé USB, impression puis reconnaissance de caractères, lecture
68 des bits au téléphone, signaux de fumée, etc. Le récepteur retrouve les mises à
69 jour du bundle en tapant :
71  $ git pull monbundle
73 Le récepteur peut même faire cela dans un dépôt entièrement vide. Malgré sa
74 petite taille +monbundle+ contient l'ensemble du dépôt Git d'origine.
76 Pour des projets plus gros, on peut réduire le gaspillage en incluant dans le
77 bundle uniquement les changements manquants dans l'autre dépôt. En supposant
78 par exemple que le commit ``1b6d...'' est le commit le plus récent partagé par
79 les deux dépôts, on peut faire :
81  $ git bundle create monbundle HEAD ^1b6d
83 Si on fait cela souvent, il se peut qu'on ne sache plus quel est le dernier
84 commit partagé. La page d'aide suggère d'utiliser des tags pour résoudre ce
85 problème. En pratique, juste après l'envoi d'un bundle, tapez :
87  $ git tag -f dernierbundle HEAD
89 et pour créer un nouveau bundle faites :
91  $ git bundle create nouveaubundle HEAD ^dernierbundle
93 === Les patches : la monnaie d'échange globale ===
95 Les patches sont des représentations textuelles de vos modifications qui
96 peuvent être facilement compris par les ordinateurs comme par les humains.
97 C'est ce qui leur donne leur charme. Vous pouvez envoyer un patch par mail à un
98 développeur sans savoir quel système de gestion de versions il utilise. À
99 partir du moment où on peut lire les mails que vous envoyez, on peut voir vos
100 modifications. De votre côté, vous n'avez besoin que d'un compte mail : aucune
101 nécessité de mettre en œuvre un dépôt Git en ligne.
103 Souvenez-vous du premier chapitre. La commande :
105  $ git diff 1b6d > mon.patch
107 produit un patch qui peut être collé dans un mail. Dans un dépôt Git, tapez :
109  $ git apply < mon.patch
111 pour appliquer le patch.
113 D'une manière plus formelle, lorsque le nom des auteurs et peut-être leur
114 signature doit apparaître, générer tous les patches depuis un certain point en
115 tapant :
117  $ git format-patch 1b6d
119 Les fichiers résultants peuvent être fournis à *git send-email* ou envoyez à la
120 main. Vous pouvez aussi spécifier un intervalle entre deux commits :
122  $ git format-patch 1b6d..HEAD^^
124 Du côté du destinataire, enregistrez un mail dans un fichier puis tapez :
126  $ git am < mail.txt
128 Ça appliquera le patch reçu mais créera aussi un commit en y incluant toutes
129 les informations telles que le nom des auteurs.
131 Si vous utilisez un client de messagerie dans un navigateur, il vous faudra
132 sans doute appuyer sur un bouton afin de voir le mail dans son format brut
133 avant de l'enregistrer dans un fichier.
135 Il y a de légères différences dans le cas des clients de messagerie se basant
136 sur le format mbox, mais si vous utilisez l'un d'entre eux, vous êtes sans
137 aucun doute capable de vous en débrouiller facilement sans lire des tutoriels !
139 (NdT : si votre dépôt contient des fichiers binaires, n'oubliez-pas d'ajouter
140 l'option +--binary+ aux commandes de création de patches ci-dessus.)
142 === Le numéro de votre correspondant a changé ===
144 Après la création d'un clone d'un dépôt, l'utilisation de *git push* ou de *git
145 pull* se référera automatiquement à l'URL du dépôt d'origine. Comment Git
146 fait-il ? Le secret réside dans des options de configuration ajoutées dans le
147 clone. Jetons-y un œil :
149  $ git config --list
151 L'option +remote.origin.url+ détermine l'URL de la source ; ``origin'' est un
152 alias donné au dépôt d'origine. Comme dans le cas de la branche principale qui
153 se nomme ``master'' par convention, on peut changer ou supprimer cet alias mais
154 il n'y a habituellement aucune raison de le faire.
156 Si le dépôt original change, vous pouvez modifier son URL via :
158  $ git config remote.origin.url git://nouvel.url/proj.git
160 L'option +branch.master.merge+ spécifie le nom de la branche distante utilisée
161 par défaut par la commande *git pull*. Lors du clonage initial, le nom choisi
162 est celui de la branche courant du dépôt d'origine. Même si le HEAD du dépôt
163 d'origine est déplacé vers une autre branche, la commande pull continuera à
164 suivre fidêlement la branche initiale.
166 Cette option ne s'applique qu'au dépôt ayant servi au clonage initial, celui
167 enregistré dans l'option +branch.master.remote+. Si nous effectuons un pull
168 depuis un autre dépôt, nous devrons indiquer explicitement la branche voulue :
170  $ git pull git://example.com/other.git master
172 Les détails ci-dessus expliquent pourquoi nos appels à push et pull dans nos
173 précédents exemples n'avaient pas besoin d'arguments.
175 === Les branches distantes ===
177 Lorsque nous clonons un dépôt, nous clonons aussi toutes ses branches. Vous ne
178 les avez sans doute pas remarquées car Git les cache : vous devez explicitement
179 demander à les voir. Cela empêche les branches du dépôt distant d'interférer
180 avec vos propres branches et cela rend aussi Git plus simple pour les
181 débutants.
183 Listons les branches distantes :
185  $ git branch -r
187 Vous devriez voir quelque chose comme :
189  origin/HEAD
190  origin/master
191  origin/experimental
193 Ces noms sont ceux des branches et du HEAD du dépôt distant et ils peuvent être
194 utilisés dans les commandes Git normales. Supposez par exemple que vous avez
195 réalisé de nombreux commits et que vous vouliez voir la différence avec la
196 dernière version ramenée par fetch. Vous pourriez rechercher dans le log pour
197 retrouver l'empreinte SHA1 appropriée mais il est beaucoup plus simple de
198 tapez :
200  $ git diff origin/HEAD
202 Vous pouvez aussi voir où en est rendu la branche ``experimental'' :
204  $ git log origin/experimental
206 === Dépôts distants multiples ===
208 Supposez que deux autres développeurs travaillent sur notre projet et que nous
209 souhaitons garder un œil sur les deux. Nous pouvons suivre plus d'un dépôt à la
210 fois grâce à :
212  $ git remote add un_autre git://example.com/un_depot.git
213  $ git pull un_autre une_branche
215 Maintenant nous avons fusionné avec une branche d'un second dépôt et nous avons
216 accès facilement à toutes les branches de tous les dépôts :
218  $ git diff origin/experimental^ un_autre/une_branche~5
220 Mais comment faire si nous souhaitons juste comparer leurs modifications sans
221 affecter notre travail ? En d'autres termes, nous voulons examiner leurs
222 branches sans que leurs modifications envahissent notre dossier de travail. À
223 la place d'un pull, faisons :
225  $ git fetch          # Rapatrier depuis le dépôt d'origin, par défaut
226  $ git fetch un_autre # Rapatrier depuis le dépôt d'un_autre
228 Cela ne rapatrie (fetch) que les historiques. Bien que notre dossier de travail
229 reste inchangé, nous pouvons faire référence à n'importe quelle branche de
230 n'importe quel dépôt dans nos commandes Git puisque nous en possédons
231 maintenant une copie locale.
233 Rappelez-vous qu'en coulisse, un *pull* est simplement un *fetch* suivi d'un
234 *merge*. Habituellement nous faisons appel à *pull* car nous voulons fusionner
235 (merge) les dernières modifications distantes après les avoir rapatriées
236 (fetch). La situation ci-dessus est une exception notable.
238 Voir *get help remote* pour savoir comment supprimer des dépôts distants,
239 ignorer certaines branches et bien plus encore.
241 === Mes préférences ===
243 Pour mes projets, j'aime que mes contributeurs se confectionnent un dépôt
244 depuis lequel je peux effectuer des pull. Certains services d'hébergement Git
245 vous permettent de créer votre propre dépôt clone d'un projet en cliquant
246 simplement sur un bouton.
248 Après avoir rapatrié (fetch) un arbre de modifications, j'utilise les commandes
249 Git pour parcourir et examiner ces modifications qui, idéalement, sont bien
250 organisées et bien décrites. Je fusionne mes propres modifications et effectue
251 parfois quelques modifications supplémentaires. Une fois satisfait, je les
252 envoie (push) vers le dépôt principal.
254 Bien que recevant rarement des contributions, je pense que mon approche est
255 parfaitement adaptable à grande échelle. Voir
256 http://torvalds-family.blogspot.com/2009/06/happiness-is-warm-scm.html[ce
257 billet par Linus Torvalds].
259 Rester dans le monde Git est un peu plus pratique que de passer par des
260 fichiers de patch puisque cela m'évite d'avoir à les convertir en commits
261 Git. De plus, Git gère les détails tels qu'enregistrer le nom de l'auteur, son
262 adresse mail ainsi que la date et l'heure et il demande à l'auteur de décrire
263 ses propres modifications.