Projet

Général

Profil

RecueilGit » Historique » Version 18

Daniel Dehennin, 25/04/2016 11:03

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