Projet

Général

Profil

RecueilGit » Historique » Version 17

Arnaud FORNEROT, 27/03/2014 11:05

1 6 Klaas TJEBBES
Recueil GIT
2 7 Klaas TJEBBES
3 1 Daniel Dehennin
{{toc}}
4 1 Daniel Dehennin
5 1 Daniel Dehennin
6 1 Daniel Dehennin
h1. Présentation
7 1 Daniel Dehennin
8 1 Daniel Dehennin
Site officiel : http://git-scm.com/
9 1 Daniel Dehennin
10 1 Daniel Dehennin
Tutoriaux intéressants : 
11 1 Daniel Dehennin
* http://team.gcu.info/~ange/git_article/
12 1 Daniel Dehennin
* le tutorial des man pages http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html
13 1 Daniel Dehennin
* http://gitready.com/
14 1 Daniel Dehennin
* http://progit.org/book/
15 1 Daniel Dehennin
* http://www.unixgarden.com/index.php/administration-systeme/git-pour-les-futurs-barbus
16 1 Daniel Dehennin
* http://yannesposito.com/Scratch/fr/blog/2010-03-22-Git-Tips/
17 1 Daniel Dehennin
18 10 Arnaud FORNEROT
Recueil des commandes :
19 9 Arnaud FORNEROT
* http://cheatography.com/samcollett/cheat-sheets/git/
20 9 Arnaud FORNEROT
21 9 Arnaud FORNEROT
22 1 Daniel Dehennin
Les manpages des commandes sont accessibles avec la commande help directement, 
23 1 Daniel Dehennin
par exemple : 
24 1 Daniel Dehennin
<pre>
25 1 Daniel Dehennin
git help log
26 1 Daniel Dehennin
</pre>
27 1 Daniel Dehennin
28 1 Daniel Dehennin
*remarque* : Il faut utiliser une version récente de git-core (>1.6.3) pour pouvoir travailler avec les dépôts. 
29 1 Daniel Dehennin
30 11 Arnaud FORNEROT
h1. Lexique de base
31 11 Arnaud FORNEROT
32 12 Arnaud FORNEROT
*git clone [adressedepot]* > clone le dépôt en local
33 12 Arnaud FORNEROT
34 12 Arnaud FORNEROT
*git pull* > rattriement de la branche distante sur la branche locale
35 12 Arnaud FORNEROT
*git push* > dépôt de la branche locale sur la branche distante
36 12 Arnaud FORNEROT
37 12 Arnaud FORNEROT
*git branch* > liste des branches locales
38 12 Arnaud FORNEROT
*git branch -a* > liste des branches locales et distantes
39 12 Arnaud FORNEROT
*git checkout [nombranche]* > aller sur la branche
40 12 Arnaud FORNEROT
*git checkout -b [nombranche]* > création d'une branche
41 12 Arnaud FORNEROT
*git push -u origin [nombranche]* > 1er push d'une branche qui vient d'être créée
42 12 Arnaud FORNEROT
*git branch -D [nombranche]* > suppression d'une branche locale
43 12 Arnaud FORNEROT
*git branche origin:[nombranche]* > suppression d'une branche distante
44 12 Arnaud FORNEROT
45 12 Arnaud FORNEROT
*git status* > affiche les fichiers qui doivent être ajoutés / supprimés / commités de la branche
46 12 Arnaud FORNEROT
*git add [nomfichier]* > ajoute un fichier
47 12 Arnaud FORNEROT
*git add .* > ajout de l'ensemble des fichiers novueaux dans la branche
48 12 Arnaud FORNEROT
*git rm [nomfichier]* > supprime un fichier
49 12 Arnaud FORNEROT
*git rm -rf [nomrépertore]* > supprime l'ensemble d'un répertorie
50 12 Arnaud FORNEROT
*git mv [nomfichier]* > déplace un fichier
51 12 Arnaud FORNEROT
52 12 Arnaud FORNEROT
*git commit -a* > validation de l'ensemble des modification de la branche
53 12 Arnaud FORNEROT
*git commit -a [filename]* > validation d'un seul fichier
54 12 Arnaud FORNEROT
*git log* > affiche l'ensemble des commits réalisés sur la branche
55 12 Arnaud FORNEROT
56 12 Arnaud FORNEROT
*git merge [nombranche]* > rappatriement des modications de la branche ciblée dans la branche en cours
57 12 Arnaud FORNEROT
*git reset __merge* > annule le dernier merge réalisé sur la branche
58 12 Arnaud FORNEROT
59 11 Arnaud FORNEROT
h1. Prompt
60 11 Arnaud FORNEROT
61 1 Daniel Dehennin
Pour une meilleur navigation dans les branches, voici un petit prompt à mettre en place.
62 1 Daniel Dehennin
63 15 Arnaud FORNEROT
> Télécharger le script suivant
64 15 Arnaud FORNEROT
> Si votre git est en anglais = https://dev-eole.ac-dijon.fr/attachments/download/870/bash_gitprompt_en.zip
65 17 Arnaud FORNEROT
> Si votre git est en français = https://dev-eole.ac-dijon.fr/attachments/download/871/bash_gitprompt_fr.zip
66 16 Arnaud FORNEROT
> Décompresser et placer dans votre home .bash_gitprompt
67 16 Arnaud FORNEROT
> modifier votre .bashrc aussi présent dans votre home
68 16 Arnaud FORNEROT
> ajouter en fin de .bashrc
69 13 Arnaud FORNEROT
> source ~/.bash_gitprompt
70 13 Arnaud FORNEROT
> export PROMPT_COMMAND
71 13 Arnaud FORNEROT
72 13 Arnaud FORNEROT
Sinon
73 1 Daniel Dehennin
http://www.git-attitude.fr/2013/05/22/prompt-git-qui-dechire/
74 13 Arnaud FORNEROT
avec un git US uniquement
75 11 Arnaud FORNEROT
76 1 Daniel Dehennin
h1. Paramétrage global
77 1 Daniel Dehennin
78 1 Daniel Dehennin
Il est nécessaire de déclarer vos noms et emails dans votre configuration git globale
79 1 Daniel Dehennin
<pre>
80 1 Daniel Dehennin
git config --global user.name "Prénom NOM"
81 1 Daniel Dehennin
git config --global user.email "prenom.nom@ac-acad.fr"
82 1 Daniel Dehennin
</pre>
83 1 Daniel Dehennin
84 1 Daniel Dehennin
Afin que le @git push@ fonctionne, il faut renseigner le fichier @~/.netrc@ :
85 1 Daniel Dehennin
<pre>
86 1 Daniel Dehennin
machine dev-eole.ac-dijon.fr
87 1 Daniel Dehennin
login monlogin
88 1 Daniel Dehennin
password monmotdepasse
89 1 Daniel Dehennin
</pre>
90 1 Daniel Dehennin
et paramétrer les droits du fichier :
91 1 Daniel Dehennin
<pre>
92 1 Daniel Dehennin
chmod 600 ~/.netrc
93 1 Daniel Dehennin
</pre>
94 1 Daniel Dehennin
95 1 Daniel Dehennin
h1. Premiers pas
96 1 Daniel Dehennin
97 1 Daniel Dehennin
* Démarrer un nouveau projet.
98 1 Daniel Dehennin
99 1 Daniel Dehennin
Demandez à l’administrateur Eole la création de votre projet dans le RedMine.
100 1 Daniel Dehennin
101 1 Daniel Dehennin
* Premier Commit du projet.
102 1 Daniel Dehennin
103 1 Daniel Dehennin
d'abord récupérer le projet :
104 1 Daniel Dehennin
<pre>
105 1 Daniel Dehennin
git clone http://login@dev-eole.ac-dijon.fr/git/nom_projet
106 1 Daniel Dehennin
</pre>
107 1 Daniel Dehennin
108 1 Daniel Dehennin
remarquons bien que le projet initialisé est *vide*
109 1 Daniel Dehennin
110 1 Daniel Dehennin
ensuite, aller dans le dossier du nom_projet, ajouter au moins un fichier, 
111 1 Daniel Dehennin
puis 
112 1 Daniel Dehennin
113 1 Daniel Dehennin
<pre>
114 1 Daniel Dehennin
git add fichier1 fichier2 fichier3
115 1 Daniel Dehennin
</pre>
116 1 Daniel Dehennin
117 1 Daniel Dehennin
<pre>
118 1 Daniel Dehennin
git commit -m"permière version"
119 1 Daniel Dehennin
</pre>
120 1 Daniel Dehennin
121 1 Daniel Dehennin
maintenant la branche master doit être apparue (puisqu'il y a des fichiers dans le projet), donc
122 1 Daniel Dehennin
123 1 Daniel Dehennin
<pre>
124 1 Daniel Dehennin
git branch
125 1 Daniel Dehennin
</pre>
126 1 Daniel Dehennin
doit lister la branche @master@
127 1 Daniel Dehennin
128 1 Daniel Dehennin
pour finir , faire un "push" pour envoyer les fichiers sur le dépot de code : 
129 1 Daniel Dehennin
<pre>
130 1 Daniel Dehennin
git push -u http://login@dev-eole.ac-dijon.fr/git/nom_projet master
131 1 Daniel Dehennin
</pre>
132 1 Daniel Dehennin
133 1 Daniel Dehennin
L'option -u (upstream) permet de créer automatiquement le lien entre la branche locale et la branche créée sur le serveur.
134 1 Daniel Dehennin
135 1 Daniel Dehennin
h1. Récupérer un projet existant.
136 1 Daniel Dehennin
137 1 Daniel Dehennin
<pre>
138 1 Daniel Dehennin
git clone http://login@dev-eole.ac-dijon.fr/git/nom_projet
139 1 Daniel Dehennin
</pre>
140 1 Daniel Dehennin
Cela va créer un répertoire @nom_projet@ contenant un répertoire @.git@.
141 1 Daniel Dehennin
142 1 Daniel Dehennin
* Ajouter/retirer des fichiers :
143 1 Daniel Dehennin
<pre>
144 1 Daniel Dehennin
git add file1 file2 ...
145 1 Daniel Dehennin
git remove file1 file2 ...
146 1 Daniel Dehennin
</pre>
147 1 Daniel Dehennin
148 1 Daniel Dehennin
* Pour savoir quel est l'état des modifications :
149 1 Daniel Dehennin
<pre>
150 1 Daniel Dehennin
git status
151 1 Daniel Dehennin
</pre>
152 1 Daniel Dehennin
153 1 Daniel Dehennin
* Enregistrer les modifications localement :
154 1 Daniel Dehennin
<pre>
155 1 Daniel Dehennin
git commit -a -m"premiere version avec le scm git"
156 1 Daniel Dehennin
</pre>
157 1 Daniel Dehennin
158 1 Daniel Dehennin
* Enregistrer les changements sur le serveur : 
159 1 Daniel Dehennin
<pre>
160 1 Daniel Dehennin
git push
161 1 Daniel Dehennin
</pre>
162 1 Daniel Dehennin
163 1 Daniel Dehennin
*remarque* : Avant d'enregistrer les changements sur le serveur, pensez à éditer vos messages de commit, il est possible de les fusionner (Voir "Messages de commit").
164 1 Daniel Dehennin
165 1 Daniel Dehennin
* Récupérer les modifications du serveur et les fusionner localement :
166 1 Daniel Dehennin
<pre>
167 1 Daniel Dehennin
git pull
168 1 Daniel Dehennin
</pre>
169 1 Daniel Dehennin
170 1 Daniel Dehennin
171 1 Daniel Dehennin
Notre serveur GIT a plusieurs branches "branch".
172 1 Daniel Dehennin
* Pour afficher les branches disponibles sur le serveur :
173 1 Daniel Dehennin
<pre>
174 1 Daniel Dehennin
git branch -a
175 1 Daniel Dehennin
</pre>
176 1 Daniel Dehennin
177 1 Daniel Dehennin
* Pour paramétrer la prise en compte d'une branche :
178 1 Daniel Dehennin
<pre>
179 1 Daniel Dehennin
git config branch.2.2.remote origin
180 1 Daniel Dehennin
git config branch.2.2.merge refs/heads/2.2
181 1 Daniel Dehennin
</pre>
182 1 Daniel Dehennin
183 1 Daniel Dehennin
* Pour récupérer la branche localement (à ne faire que la première fois) :
184 1 Daniel Dehennin
<pre>
185 1 Daniel Dehennin
git fetch origin 2.2:2.2
186 1 Daniel Dehennin
</pre>
187 1 Daniel Dehennin
188 1 Daniel Dehennin
* Pour se placer dans la branche :
189 1 Daniel Dehennin
<pre>
190 1 Daniel Dehennin
git checkout 2.2
191 1 Daniel Dehennin
</pre>
192 1 Daniel Dehennin
193 1 Daniel Dehennin
* Récupérer les modifications du serveur :
194 1 Daniel Dehennin
<pre>
195 1 Daniel Dehennin
git pull
196 1 Daniel Dehennin
</pre>
197 1 Daniel Dehennin
198 1 Daniel Dehennin
* Pour se placer dans une autre branche, "master" par exemple :
199 1 Daniel Dehennin
<pre>
200 1 Daniel Dehennin
git checkout master
201 1 Daniel Dehennin
</pre>
202 1 Daniel Dehennin
203 1 Daniel Dehennin
204 1 Daniel Dehennin
h1. Branch
205 1 Daniel Dehennin
206 1 Daniel Dehennin
 * Récupérer une branche
207 1 Daniel Dehennin
<pre>
208 1 Daniel Dehennin
git checkout nomDeBrancheExistant
209 1 Daniel Dehennin
</pre>
210 1 Daniel Dehennin
211 1 Daniel Dehennin
 * Créer une branche
212 1 Daniel Dehennin
Se placer dans la branche que l'on veut copier
213 1 Daniel Dehennin
<pre>
214 1 Daniel Dehennin
git checkout maBrancheABrancher
215 1 Daniel Dehennin
...
216 1 Daniel Dehennin
git checkout -b maNouvelleBranche
217 1 Daniel Dehennin
</pre>
218 1 Daniel Dehennin
219 1 Daniel Dehennin
 * Ceci peut être décomposé en 2 commandes :
220 1 Daniel Dehennin
<pre>
221 1 Daniel Dehennin
git branch mabranche
222 1 Daniel Dehennin
git checkout mabranche
223 1 Daniel Dehennin
</pre>
224 1 Daniel Dehennin
225 1 Daniel Dehennin
 * Diffuser la branche sur le serveur
226 1 Daniel Dehennin
<pre>
227 1 Daniel Dehennin
git push http://user@194.167.18.22/git/eolebase mabranche
228 1 Daniel Dehennin
</pre>
229 1 Daniel Dehennin
ou, plus simplement :
230 1 Daniel Dehennin
<pre>
231 1 Daniel Dehennin
git push --all
232 1 Daniel Dehennin
</pre>
233 1 Daniel Dehennin
234 1 Daniel Dehennin
* Créer une branche à partir d'un numéro de commit
235 1 Daniel Dehennin
<pre>
236 1 Daniel Dehennin
git checkout -b mabranche <numero_de_commit>
237 1 Daniel Dehennin
</pre>
238 1 Daniel Dehennin
239 1 Daniel Dehennin
* Supprimer une branche :
240 1 Daniel Dehennin
<pre>
241 1 Daniel Dehennin
git branch -D [nom-branche]
242 1 Daniel Dehennin
</pre>
243 1 Daniel Dehennin
244 1 Daniel Dehennin
* Supprimer une branche sur le dépôt origin
245 1 Daniel Dehennin
<pre>
246 1 Daniel Dehennin
git push origin :branche
247 1 Daniel Dehennin
</pre>
248 1 Daniel Dehennin
Cela correspond en fait à cette commande là : git push REMOTENAME LOCALBRANCHNAME:REMOTEBRANCHNAME sauf que LOCALBRANCHNAME est vide dans notre exemple.
249 1 Daniel Dehennin
250 1 Daniel Dehennin
251 1 Daniel Dehennin
* Voir les différences entre deux branches
252 1 Daniel Dehennin
(par exemple avant de merger) : 
253 1 Daniel Dehennin
<pre>
254 1 Daniel Dehennin
git diff-tree -p [nom-de-branche]
255 1 Daniel Dehennin
</pre>
256 1 Daniel Dehennin
257 1 Daniel Dehennin
* Pour changer de branche :
258 1 Daniel Dehennin
<pre>
259 1 Daniel Dehennin
git checkout autrebranche
260 1 Daniel Dehennin
</pre>
261 1 Daniel Dehennin
262 1 Daniel Dehennin
* Pour revenir à la branche principale :
263 1 Daniel Dehennin
<pre>
264 1 Daniel Dehennin
git checkout master
265 1 Daniel Dehennin
</pre>
266 1 Daniel Dehennin
267 1 Daniel Dehennin
* Une autre technique consiste à organiser localement une arborescence différente par branche :
268 1 Daniel Dehennin
<pre>
269 1 Daniel Dehennin
git/master
270 1 Daniel Dehennin
   /mabranche
271 1 Daniel Dehennin
</pre>
272 1 Daniel Dehennin
273 1 Daniel Dehennin
* Savoir dans quelle branche on se trouve :
274 1 Daniel Dehennin
<pre>
275 1 Daniel Dehennin
git branch
276 1 Daniel Dehennin
</pre>
277 1 Daniel Dehennin
278 1 Daniel Dehennin
* Voir la branche courante avec le dernier log :
279 1 Daniel Dehennin
<pre>
280 1 Daniel Dehennin
git show-branch
281 1 Daniel Dehennin
</pre>
282 1 Daniel Dehennin
283 1 Daniel Dehennin
* Envoyer pour la _première fois_ le contenu de la branche courante sur le serveur :
284 1 Daniel Dehennin
<pre>
285 1 Daniel Dehennin
git push origin HEAD
286 1 Daniel Dehennin
</pre>
287 1 Daniel Dehennin
288 1 Daniel Dehennin
Arrivé à ce stade il peut être intéressant d'utiliser @git-gui@ (@/usr/lib/git-core/git-gui@) ou @giggle@.
289 1 Daniel Dehennin
290 1 Daniel Dehennin
Pour voir l'historique des différentes branches dans @guit-gui@, "@menu>dépôt>Voir l'historique de toutes les branches@"
291 1 Daniel Dehennin
292 1 Daniel Dehennin
* Autres commandes de base :
293 1 Daniel Dehennin
<pre>
294 1 Daniel Dehennin
git log
295 1 Daniel Dehennin
git log --pretty=oneline --all
296 1 Daniel Dehennin
git diff
297 1 Daniel Dehennin
</pre>
298 1 Daniel Dehennin
299 1 Daniel Dehennin
300 1 Daniel Dehennin
h2. Branches distantes
301 1 Daniel Dehennin
302 1 Daniel Dehennin
* Si vous avez déjà cloné le master d'un projet, pour visualiser les branches disponibles :
303 1 Daniel Dehennin
<pre>
304 1 Daniel Dehennin
git branch -a
305 1 Daniel Dehennin
</pre>
306 1 Daniel Dehennin
devrait renvoyer quelque chose comme ceci :
307 1 Daniel Dehennin
<pre>
308 1 Daniel Dehennin
* master
309 1 Daniel Dehennin
  remotes/origin/2.2
310 1 Daniel Dehennin
  remotes/origin/HEAD -> origin/master
311 1 Daniel Dehennin
  remotes/origin/master
312 1 Daniel Dehennin
  remotes/origin/upstream
313 1 Daniel Dehennin
</pre>
314 1 Daniel Dehennin
315 1 Daniel Dehennin
* Pour récupérer la branche 2.2 :
316 1 Daniel Dehennin
<pre>
317 1 Daniel Dehennin
git co 2.2
318 1 Daniel Dehennin
</pre>
319 1 Daniel Dehennin
va récupérer la branche 2.2 auprès du serveur origin.
320 1 Daniel Dehennin
Une autre méthode:
321 1 Daniel Dehennin
<pre>
322 1 Daniel Dehennin
git branch --track 2.2 remotes/origin/2.2
323 1 Daniel Dehennin
</pre>
324 1 Daniel Dehennin
325 1 Daniel Dehennin
h1. Merge
326 1 Daniel Dehennin
327 1 Daniel Dehennin
Fusion : action consistant à fusionner une branche avec une autre ("mabranche" avec @master@ par exemple)
328 1 Daniel Dehennin
329 1 Daniel Dehennin
Exemple : @merge@ de la branche *mabranche* dans la branche *master* 
330 1 Daniel Dehennin
331 1 Daniel Dehennin
* Se placer dans la branche @master@ :
332 1 Daniel Dehennin
<pre>
333 1 Daniel Dehennin
git checkout master
334 1 Daniel Dehennin
git merge mabranche
335 1 Daniel Dehennin
</pre>
336 1 Daniel Dehennin
337 3 Fabrice Barconnière
*remarque* : après un @merge@ réussi, il n'y a pas de @commit@ à faire.
338 1 Daniel Dehennin
339 1 Daniel Dehennin
Si vous n'êtes pas satisfait du @merge@, il faut revenir en arrière avec un 
340 1 Daniel Dehennin
<pre>
341 1 Daniel Dehennin
git reset --hard
342 1 Daniel Dehennin
</pre>
343 1 Daniel Dehennin
344 1 Daniel Dehennin
**Résoudre un conflit de @merge@**
345 1 Daniel Dehennin
346 1 Daniel Dehennin
Si lors d'un @merge@ il y a eu un problème du type :
347 1 Daniel Dehennin
<pre>
348 1 Daniel Dehennin
Auto-merged file.txt
349 1 Daniel Dehennin
CONFLICT (content): Merge conflict in file.txt
350 1 Daniel Dehennin
Automatic merge failed; fix conflicts and then commit the result.
351 1 Daniel Dehennin
</pre> et que
352 1 Daniel Dehennin
<pre>
353 1 Daniel Dehennin
git commit
354 2 Fabrice Barconnière
</pre> répond qu'il reste des fichiers à merger (unresolved merge), *Il n'y a donc pas eu de commit*
355 1 Daniel Dehennin
de même qu'un
356 1 Daniel Dehennin
<pre>
357 1 Daniel Dehennin
git status
358 1 Daniel Dehennin
</pre>
359 1 Daniel Dehennin
360 1 Daniel Dehennin
Il faut alors éditer le fichier concerné, résoudre le conflit à la main et faire un nouveau un @commit@ :
361 1 Daniel Dehennin
<pre>
362 1 Daniel Dehennin
git add [file.txt]
363 1 Daniel Dehennin
git commit
364 1 Daniel Dehennin
</pre>
365 1 Daniel Dehennin
366 1 Daniel Dehennin
Le message @fatal: You have not concluded your merge. (MERGE_HEAD exists)@ vous rappelle qu'il ne faut pas utiliser l'option "-m" ici ;)
367 1 Daniel Dehennin
368 1 Daniel Dehennin
* Pour repérer les fichiers qui n'ont pas été fusionné :
369 1 Daniel Dehennin
<pre>
370 1 Daniel Dehennin
git ls-files --unmerged
371 1 Daniel Dehennin
</pre>
372 1 Daniel Dehennin
373 1 Daniel Dehennin
374 1 Daniel Dehennin
375 1 Daniel Dehennin
376 1 Daniel Dehennin
h1. Stash
377 1 Daniel Dehennin
378 1 Daniel Dehennin
*git stash* permet de sauvegarder des modifications locales afin de les appliquer plus tard.
379 1 Daniel Dehennin
380 1 Daniel Dehennin
* Sauvegarde des modifications :
381 1 Daniel Dehennin
<pre>
382 1 Daniel Dehennin
# git stash save "en attente"
383 1 Daniel Dehennin
Saved working directory and index state On master: en attente
384 1 Daniel Dehennin
</pre>
385 1 Daniel Dehennin
* Liste des modifications sauvegardées :
386 1 Daniel Dehennin
<pre>
387 1 Daniel Dehennin
git stash list
388 1 Daniel Dehennin
stash@{0}: On master: en attente
389 1 Daniel Dehennin
</pre>
390 1 Daniel Dehennin
* Revenir à l'état sauvegardé (_stash@{1}_ pour restaurer la 2ème sauvegarde) :
391 1 Daniel Dehennin
<pre>
392 1 Daniel Dehennin
git stash apply [stash@{0}]
393 1 Daniel Dehennin
</pre>
394 1 Daniel Dehennin
* Nettoyer la liste des sauvegarde :
395 1 Daniel Dehennin
<pre>
396 1 Daniel Dehennin
git stash clear
397 1 Daniel Dehennin
</pre>
398 1 Daniel Dehennin
399 1 Daniel Dehennin
400 1 Daniel Dehennin
401 1 Daniel Dehennin
h1. Message de commit
402 1 Daniel Dehennin
403 1 Daniel Dehennin
*IMPORTANT* : ne pas effectuer de modifications sur des commits déjà envoyés sur le serveur origin (le dépot).
404 1 Daniel Dehennin
405 1 Daniel Dehennin
Avant d'envoyer vos données sur le serveur, il est possible de modifier/améliorer les messages de commit.
406 1 Daniel Dehennin
407 1 Daniel Dehennin
h2. Modifier le dernier message de commit
408 1 Daniel Dehennin
409 1 Daniel Dehennin
<pre>
410 1 Daniel Dehennin
git commit --amend
411 1 Daniel Dehennin
</pre>
412 1 Daniel Dehennin
Modifier, sauvegarder et quitter.
413 1 Daniel Dehennin
414 1 Daniel Dehennin
h2. Modifier les trois derniers messages
415 1 Daniel Dehennin
416 1 Daniel Dehennin
* On lance un rebase
417 1 Daniel Dehennin
<pre>
418 1 Daniel Dehennin
git rebase -i HEAD~3
419 1 Daniel Dehennin
</pre>
420 1 Daniel Dehennin
* Un éditeur de texte s'ouvre avec quelque chose qui ressemble à ça:
421 1 Daniel Dehennin
<pre>
422 1 Daniel Dehennin
pick 6ffa65b update des bases de donnees editable=0 et pas 2
423 1 Daniel Dehennin
pick 9697740 update des bases vers 2.2.3 : nettoyage et ajout d'un __init__.py (ref #11)
424 1 Daniel Dehennin
pick e56a7a4 Configuration des bases de donnees pour le passage en version 2.2.3 (fixes #11 : fixé)
425 1 Daniel Dehennin
426 1 Daniel Dehennin
# Rebase cd9333c..e56a7a4 onto cd9333c
427 1 Daniel Dehennin
#
428 1 Daniel Dehennin
# Commands:
429 1 Daniel Dehennin
#  p, pick = use commit
430 1 Daniel Dehennin
#  r, reword = use commit, but edit the commit message
431 1 Daniel Dehennin
#  e, edit = use commit, but stop for amending
432 1 Daniel Dehennin
#  s, squash = use commit, but meld into previous commit
433 1 Daniel Dehennin
#
434 1 Daniel Dehennin
# If you remove a line here THAT COMMIT WILL BE LOST.
435 1 Daniel Dehennin
# However, if you remove everything, the rebase will be aborted.
436 1 Daniel Dehennin
#
437 1 Daniel Dehennin
</pre>
438 1 Daniel Dehennin
* Changer pick en edit sur les lignes correspondantes aux commit à modifier, par exemple :
439 1 Daniel Dehennin
<pre>
440 1 Daniel Dehennin
edit 6ffa65b update des bases de donnees editable=0 et pas 2
441 1 Daniel Dehennin
pick 9697740 update des bases vers 2.2.3 : nettoyage et ajout d'un __init__.py (ref #11)
442 1 Daniel Dehennin
pick e56a7a4 Configuration des bases de donnees pour le passage en version 2.2.3 (fixes #11 : fixé)
443 1 Daniel Dehennin
</pre>
444 1 Daniel Dehennin
* Sauver et quitter.
445 1 Daniel Dehennin
* Lancer la commande :
446 1 Daniel Dehennin
<pre>
447 1 Daniel Dehennin
git commit --amend
448 1 Daniel Dehennin
</pre>
449 1 Daniel Dehennin
* Modifier les messages de commit, par ex :
450 1 Daniel Dehennin
<pre>
451 1 Daniel Dehennin
update des bases de donnees editable=0 et pas 2 (ref #11)
452 1 Daniel Dehennin
</pre> 
453 1 Daniel Dehennin
* Sauvegarder et quitter
454 1 Daniel Dehennin
* Lancer la commande :
455 1 Daniel Dehennin
<pre>
456 1 Daniel Dehennin
git rebase --continue
457 1 Daniel Dehennin
</pre>
458 1 Daniel Dehennin
* Vérifier les messages de commit
459 1 Daniel Dehennin
<pre>
460 1 Daniel Dehennin
git log
461 1 Daniel Dehennin
</pre>
462 1 Daniel Dehennin
463 1 Daniel Dehennin
464 1 Daniel Dehennin
h2. Fusionner des commits
465 1 Daniel Dehennin
466 1 Daniel Dehennin
Il est possible de fusionner des commit afin d'éviter des commits multiples pour des modifications mineures.
467 1 Daniel Dehennin
* Lancer un git rebase
468 1 Daniel Dehennin
<pre>
469 1 Daniel Dehennin
git rebase -i HEAD~3
470 1 Daniel Dehennin
</pre>
471 1 Daniel Dehennin
<pre>
472 1 Daniel Dehennin
pick 16098ec Ajout d'icône gepi et cdt (ref #51)
473 1 Daniel Dehennin
pick f244e89 Deplacement d'icone
474 1 Daniel Dehennin
pick 7c8670c Deplacement des icones sources
475 1 Daniel Dehennin
476 1 Daniel Dehennin
# Rebase 5f5bfee..7c8670c onto 5f5bfee
477 1 Daniel Dehennin
#
478 1 Daniel Dehennin
# Commands:
479 1 Daniel Dehennin
#  p, pick = use commit
480 1 Daniel Dehennin
#  r, reword = use commit, but edit the commit message
481 1 Daniel Dehennin
#  e, edit = use commit, but stop for amending
482 1 Daniel Dehennin
#  s, squash = use commit, but meld into previous commit
483 1 Daniel Dehennin
#
484 1 Daniel Dehennin
# If you remove a line here THAT COMMIT WILL BE LOST.
485 1 Daniel Dehennin
# However, if you remove everything, the rebase will be aborted.
486 1 Daniel Dehennin
#
487 1 Daniel Dehennin
</pre>
488 1 Daniel Dehennin
489 1 Daniel Dehennin
* Changer pick en squash fusionne votre commit avec la ligne au-dessus
490 1 Daniel Dehennin
<pre>
491 1 Daniel Dehennin
pick 16098ec Ajout d'icône gepi et cdt (ref #51)
492 1 Daniel Dehennin
squash f244e89 Deplacement d'icone
493 1 Daniel Dehennin
squash 7c8670c Deplacement des icones sources
494 1 Daniel Dehennin
</pre>
495 1 Daniel Dehennin
* Sauver et quitter, Un éditeur s'ouvre:
496 1 Daniel Dehennin
<pre>
497 1 Daniel Dehennin
# This is a combination of 3 commits.
498 1 Daniel Dehennin
# The first commit's message is:
499 1 Daniel Dehennin
Ajout d'icône gepi et cdt (ref #51)
500 1 Daniel Dehennin
501 1 Daniel Dehennin
# This is the 2nd commit message:
502 1 Daniel Dehennin
503 1 Daniel Dehennin
Deplacement d'icone
504 1 Daniel Dehennin
505 1 Daniel Dehennin
# This is the 3rd commit message:
506 1 Daniel Dehennin
507 1 Daniel Dehennin
Deplacement des icones sources
508 1 Daniel Dehennin
509 1 Daniel Dehennin
# Please enter the commit message for your changes. Lines starting
510 1 Daniel Dehennin
# with '#' will be ignored, and an empty message aborts the commit.
511 1 Daniel Dehennin
# Not currently on any branch.
512 1 Daniel Dehennin
# Changes to be committed:
513 1 Daniel Dehennin
#   (use "git reset HEAD <file>..." to unstage)
514 1 Daniel Dehennin
#
515 1 Daniel Dehennin
#       modified:   eole/tmpls/update_creole_posh.sql
516 1 Daniel Dehennin
#       renamed:    plugins/plugin_desktop/icones/old/Corbeille.png -> plugins/plugin_desktop/icones/Corbeille.png
517 1 Daniel Dehennin
#       renamed:    plugins/plugin_desktop/icones/old/Courrier.png -> plugins/plugin_desktop/icones/Courrier.png
518 1 Daniel Dehennin
#       renamed:    plugins/plugin_desktop/icones/old/agenda.png -> plugins/plugin_desktop/icones/agenda.png
519 1 Daniel Dehennin
#       new file:   plugins/plugin_desktop/icones/cdt.png
520 1 Daniel Dehennin
#       modified:   plugins/plugin_desktop/icones/dir.png
521 1 Daniel Dehennin
#       modified:   plugins/plugin_desktop/icones/gepi.png
522 1 Daniel Dehennin
#       renamed:    plugins/plugin_desktop/icones/old/mail.jpg -> plugins/plugin_desktop/icones/mail.jpg
523 1 Daniel Dehennin
#       modified:   plugins/plugin_desktop/icones/mail.png
524 1 Daniel Dehennin
#       new file:   sources-desktop/icones/cdt.xcf
525 1 Daniel Dehennin
#       renamed:    plugins/plugin_desktop/icones/grand/moodle.gif -> sources-desktop/icones/moodle.gif
526 1 Daniel Dehennin
#
527 1 Daniel Dehennin
# Untracked files:
528 1 Daniel Dehennin
#   (use "git add <file>..." to include in what will be committed)
529 1 Daniel Dehennin
#
530 1 Daniel Dehennin
#       databases/bdd/scribe-posh.sql.sav
531 1 Daniel Dehennin
</pre>
532 1 Daniel Dehennin
* Éditer les messages (un message suffit)
533 1 Daniel Dehennin
<pre>
534 1 Daniel Dehennin
# The first commit's message is:
535 1 Daniel Dehennin
Ajout d'icône pour les applications scribe (ref #51)
536 1 Daniel Dehennin
# This is the 2nd commit message:
537 1 Daniel Dehennin
538 1 Daniel Dehennin
# This is the 3rd commit message:
539 1 Daniel Dehennin
540 1 Daniel Dehennin
# Please enter the commit message for your changes. Lines starting
541 1 Daniel Dehennin
</pre>
542 1 Daniel Dehennin
* Sauver et quitter
543 1 Daniel Dehennin
* Vérifier que cela ressemble bien à ce que vous voulez
544 1 Daniel Dehennin
<pre>
545 1 Daniel Dehennin
git log
546 1 Daniel Dehennin
</pre>
547 1 Daniel Dehennin
548 1 Daniel Dehennin
549 1 Daniel Dehennin
h1. Trucs et astuces
550 1 Daniel Dehennin
551 1 Daniel Dehennin
* Résoudre un signalement avec l'ajout de "fixes #<numéro du signalement>"
552 1 Daniel Dehennin
<pre>
553 1 Daniel Dehennin
git commit -m"La nouvelle feature fixes #<numéro du signalement>"
554 1 Daniel Dehennin
git push ....
555 1 Daniel Dehennin
</pre>
556 1 Daniel Dehennin
557 1 Daniel Dehennin
* Faire référence à un signalement
558 1 Daniel Dehennin
<pre>
559 1 Daniel Dehennin
git commit -m"bla bla bal du bug #<numéro du signalement>"
560 1 Daniel Dehennin
</pre>
561 1 Daniel Dehennin
562 1 Daniel Dehennin
* Activer la coloration syntaxique 
563 1 Daniel Dehennin
<pre>
564 1 Daniel Dehennin
git config --global color.ui true
565 1 Daniel Dehennin
</pre>
566 1 Daniel Dehennin
567 1 Daniel Dehennin
* Pour controler les fichiers à ne JAMAIS prendre en compte (@commit@), utiliser le fichier @~/.gitignore@. Exemple d'un fichier @~/.gitignore@ :
568 1 Daniel Dehennin
<pre>
569 1 Daniel Dehennin
# ignorer le fichier lui même
570 1 Daniel Dehennin
.gitignore
571 1 Daniel Dehennin
# les fichiers de sauvegarde VIM
572 1 Daniel Dehennin
*~
573 1 Daniel Dehennin
# ignorer les fichiers html générés
574 1 Daniel Dehennin
*.html
575 1 Daniel Dehennin
# sauf mon_fichier.html que je veux prendre en compte
576 1 Daniel Dehennin
!mon_fichier.html
577 1 Daniel Dehennin
# ignorer les dossiers @.svn@
578 1 Daniel Dehennin
.svn
579 1 Daniel Dehennin
# ignore documentation buid html files
580 1 Daniel Dehennin
.build
581 1 Daniel Dehennin
</pre>
582 1 Daniel Dehennin
583 8 Gérald Schwartzmann
De nombreux exemples de gitignore en fonction des applications et des frameworks : https://github.com/github/gitignore
584 8 Gérald Schwartzmann
585 1 Daniel Dehennin
* Le fichier @~/.gitconfig@ peut permettre d'éviter de taper trop au clavier :
586 1 Daniel Dehennin
<pre>
587 1 Daniel Dehennin
[alias]
588 1 Daniel Dehennin
      st = status
589 1 Daniel Dehennin
      di = diff
590 1 Daniel Dehennin
      co = checkout
591 1 Daniel Dehennin
      ci = commit
592 1 Daniel Dehennin
      br = branch
593 1 Daniel Dehennin
      sta = stash
594 1 Daniel Dehennin
</pre>
595 1 Daniel Dehennin
596 1 Daniel Dehennin
* Pour éviter de taper l'URL et son mot de passe à chaque @push@ et @pull@, il faut :
597 1 Daniel Dehennin
598 1 Daniel Dehennin
 * configurer l'URL du projet
599 1 Daniel Dehennin
<pre>
600 1 Daniel Dehennin
git config remote.origin.url http://194.167.18.22/git/projet/
601 1 Daniel Dehennin
git config remote.origin.mirror false
602 1 Daniel Dehennin
</pre>
603 1 Daniel Dehennin
 * renseigner le fichier @~/.netrc@ :
604 1 Daniel Dehennin
<pre>
605 1 Daniel Dehennin
machine dev-eole.ac-dijon.fr
606 1 Daniel Dehennin
login monlogin
607 1 Daniel Dehennin
password monmotdepasse
608 1 Daniel Dehennin
</pre>
609 1 Daniel Dehennin
 * paramétrer les droits du fichier @~/.netrc@ :
610 1 Daniel Dehennin
<pre>
611 1 Daniel Dehennin
chmod 600 ~/.netrc
612 1 Daniel Dehennin
</pre>
613 1 Daniel Dehennin
Ensuite @git push@ et @git pull@ ne posent plus de questions.
614 1 Daniel Dehennin
615 1 Daniel Dehennin
616 1 Daniel Dehennin
* Pour faire le ménage :
617 1 Daniel Dehennin
<pre>
618 1 Daniel Dehennin
git repack
619 1 Daniel Dehennin
git prune
620 1 Daniel Dehennin
</pre>
621 1 Daniel Dehennin
622 1 Daniel Dehennin
* Pour repérer des @commit@ dans des branches qui n'ont pas été fusionnés (@merge@) dans la branche principale :
623 1 Daniel Dehennin
* Pour voir les @commit@ dans la branche *ma_branche* qui n'ont pas été fusionnés (@merge@) dans *master* : 
624 1 Daniel Dehennin
<pre>
625 1 Daniel Dehennin
git cherry -v master ma_branche
626 1 Daniel Dehennin
</pre>
627 1 Daniel Dehennin
628 1 Daniel Dehennin
h1. De subversion vers git
629 1 Daniel Dehennin
630 1 Daniel Dehennin
Il n'existe pas de commande *@update@*. Lorsqu'un fichier a été modifié localement par erreur et qu'on veut récupérer l'original, les habitudes étaient :
631 1 Daniel Dehennin
<pre>
632 1 Daniel Dehennin
rm mon_fichier
633 1 Daniel Dehennin
svn update
634 1 Daniel Dehennin
</pre>
635 1 Daniel Dehennin
636 1 Daniel Dehennin
A la place, il faut faire
637 1 Daniel Dehennin
<pre>
638 1 Daniel Dehennin
git checkout mon_fichier
639 1 Daniel Dehennin
</pre>
640 1 Daniel Dehennin
641 1 Daniel Dehennin
Pour revenir à un checkout frais dans le projet entier, utiliser *@reset@*. On peut annuler un commit en faisant :
642 1 Daniel Dehennin
643 1 Daniel Dehennin
<pre>
644 1 Daniel Dehennin
git reset --hard HEAD
645 1 Daniel Dehennin
</pre>
646 1 Daniel Dehennin
647 1 Daniel Dehennin
h1. De bazaar vers git
648 1 Daniel Dehennin
649 1 Daniel Dehennin
Il est possible de suivre un projet [[bzr depuis git]] grâce à un plugin.
650 1 Daniel Dehennin
651 1 Daniel Dehennin
Certains logiciels sont ainsi suivi au sein du projet EOLE.
652 1 Daniel Dehennin
653 1 Daniel Dehennin
h1. Créer un patch et l'intégrer
654 1 Daniel Dehennin
655 1 Daniel Dehennin
Dans un projet (Ex.: conf-horus) on a créé une branche "ma_branche" dans laquelle on a fait des modifications (par rapport à "master").
656 1 Daniel Dehennin
657 1 Daniel Dehennin
On veut récupérer un fichier recensant les différences entre la branche *master* et la branche *ma_branche* (un fichier @diff@) :
658 1 Daniel Dehennin
<pre>
659 1 Daniel Dehennin
git diff master [nom-de-branche]  > file.patch
660 1 Daniel Dehennin
</pre>
661 1 Daniel Dehennin
662 1 Daniel Dehennin
* Une fois le patch récupéré, pour l'inclure dans la branche *master* :
663 1 Daniel Dehennin
664 1 Daniel Dehennin
<pre>
665 1 Daniel Dehennin
git apply --stat file.patch
666 1 Daniel Dehennin
git apply --check file.patch
667 1 Daniel Dehennin
</pre> permet de tester le patch, et :
668 1 Daniel Dehennin
<pre>
669 1 Daniel Dehennin
git apply file.patch
670 1 Daniel Dehennin
</pre> permet de l'appliquer
671 1 Daniel Dehennin
672 1 Daniel Dehennin
h1. Tags
673 1 Daniel Dehennin
674 1 Daniel Dehennin
675 1 Daniel Dehennin
*git* fait une différence entre les branches et les tags, cela se voit bien avec *git-gui* (vue de l'historique des branches).
676 1 Daniel Dehennin
677 1 Daniel Dehennin
Une branche est modifiable, un tag ne l'est pas. 
678 1 Daniel Dehennin
679 1 Daniel Dehennin
* Création du @tag@ :
680 1 Daniel Dehennin
<pre>
681 1 Daniel Dehennin
git tag mon-premier-tag
682 1 Daniel Dehennin
</pre>
683 1 Daniel Dehennin
684 1 Daniel Dehennin
* Liste des tags :
685 1 Daniel Dehennin
<pre>
686 1 Daniel Dehennin
git tag
687 1 Daniel Dehennin
</pre>
688 1 Daniel Dehennin
689 1 Daniel Dehennin
* Commit d'un @tag@ :
690 1 Daniel Dehennin
<pre>
691 1 Daniel Dehennin
git push --tags http://login@dev-eole.ac-dijon.fr/git/sandbox
692 1 Daniel Dehennin
</pre>
693 1 Daniel Dehennin
694 1 Daniel Dehennin
 * ou bien :
695 1 Daniel Dehennin
<pre>
696 1 Daniel Dehennin
git push http://login@dev-eole.ac-dijon.fr/git/sandbox <nom_tag>
697 1 Daniel Dehennin
</pre>
698 1 Daniel Dehennin
699 1 Daniel Dehennin
 * ou encore :
700 1 Daniel Dehennin
<pre>
701 1 Daniel Dehennin
git push http://login@dev-eole.ac-dijon.fr/git/sandbox <nom_branche> <nom_tag>
702 1 Daniel Dehennin
</pre>
703 1 Daniel Dehennin
704 1 Daniel Dehennin
* Recupérer un @tag@ :
705 1 Daniel Dehennin
<pre>
706 1 Daniel Dehennin
git checkout tags/<nom_tag>
707 1 Daniel Dehennin
</pre>
708 1 Daniel Dehennin
709 1 Daniel Dehennin
* Pour voir quel @commit@ exactement a été taggé :
710 1 Daniel Dehennin
<pre>
711 1 Daniel Dehennin
git show <nom_tag>
712 1 Daniel Dehennin
</pre>