Projet

Général

Profil

RecueilGit » Historique » Version 19

Joël Cuissinat, 25/04/2016 11:31

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 19 Joël Cuissinat
git clone https://login@dev-eole.ac-dijon.fr/git/nom_projet.git
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
h1. Branch
228 1 Daniel Dehennin
229 1 Daniel Dehennin
 * Récupérer une branche
230 1 Daniel Dehennin
<pre>
231 1 Daniel Dehennin
git checkout nomDeBrancheExistant
232 1 Daniel Dehennin
</pre>
233 1 Daniel Dehennin
234 1 Daniel Dehennin
 * Créer une branche
235 1 Daniel Dehennin
Se placer dans la branche que l'on veut copier
236 1 Daniel Dehennin
<pre>
237 1 Daniel Dehennin
git checkout maBrancheABrancher
238 1 Daniel Dehennin
...
239 1 Daniel Dehennin
git checkout -b maNouvelleBranche
240 1 Daniel Dehennin
</pre>
241 1 Daniel Dehennin
242 1 Daniel Dehennin
 * Ceci peut être décomposé en 2 commandes :
243 1 Daniel Dehennin
<pre>
244 1 Daniel Dehennin
git branch mabranche
245 1 Daniel Dehennin
git checkout mabranche
246 1 Daniel Dehennin
</pre>
247 1 Daniel Dehennin
248 1 Daniel Dehennin
 * Diffuser la branche sur le serveur
249 1 Daniel Dehennin
<pre>
250 1 Daniel Dehennin
git push http://user@194.167.18.22/git/eolebase mabranche
251 1 Daniel Dehennin
</pre>
252 1 Daniel Dehennin
ou, plus simplement :
253 1 Daniel Dehennin
<pre>
254 1 Daniel Dehennin
git push --all
255 1 Daniel Dehennin
</pre>
256 1 Daniel Dehennin
257 1 Daniel Dehennin
* Créer une branche à partir d'un numéro de commit
258 1 Daniel Dehennin
<pre>
259 1 Daniel Dehennin
git checkout -b mabranche <numero_de_commit>
260 1 Daniel Dehennin
</pre>
261 1 Daniel Dehennin
262 1 Daniel Dehennin
* Supprimer une branche :
263 1 Daniel Dehennin
<pre>
264 1 Daniel Dehennin
git branch -D [nom-branche]
265 1 Daniel Dehennin
</pre>
266 1 Daniel Dehennin
267 1 Daniel Dehennin
* Supprimer une branche sur le dépôt origin
268 1 Daniel Dehennin
<pre>
269 1 Daniel Dehennin
git push origin :branche
270 1 Daniel Dehennin
</pre>
271 1 Daniel Dehennin
Cela correspond en fait à cette commande là : git push REMOTENAME LOCALBRANCHNAME:REMOTEBRANCHNAME sauf que LOCALBRANCHNAME est vide dans notre exemple.
272 1 Daniel Dehennin
273 1 Daniel Dehennin
274 1 Daniel Dehennin
* Voir les différences entre deux branches
275 1 Daniel Dehennin
(par exemple avant de merger) : 
276 1 Daniel Dehennin
<pre>
277 1 Daniel Dehennin
git diff-tree -p [nom-de-branche]
278 1 Daniel Dehennin
</pre>
279 1 Daniel Dehennin
280 1 Daniel Dehennin
* Pour changer de branche :
281 1 Daniel Dehennin
<pre>
282 1 Daniel Dehennin
git checkout autrebranche
283 1 Daniel Dehennin
</pre>
284 1 Daniel Dehennin
285 1 Daniel Dehennin
* Pour revenir à la branche principale :
286 1 Daniel Dehennin
<pre>
287 1 Daniel Dehennin
git checkout master
288 1 Daniel Dehennin
</pre>
289 1 Daniel Dehennin
290 1 Daniel Dehennin
* Une autre technique consiste à organiser localement une arborescence différente par branche :
291 1 Daniel Dehennin
<pre>
292 1 Daniel Dehennin
git/master
293 1 Daniel Dehennin
   /mabranche
294 1 Daniel Dehennin
</pre>
295 1 Daniel Dehennin
296 1 Daniel Dehennin
* Savoir dans quelle branche on se trouve :
297 1 Daniel Dehennin
<pre>
298 1 Daniel Dehennin
git branch
299 1 Daniel Dehennin
</pre>
300 1 Daniel Dehennin
301 1 Daniel Dehennin
* Voir la branche courante avec le dernier log :
302 1 Daniel Dehennin
<pre>
303 1 Daniel Dehennin
git show-branch
304 1 Daniel Dehennin
</pre>
305 1 Daniel Dehennin
306 1 Daniel Dehennin
* Envoyer pour la _première fois_ le contenu de la branche courante sur le serveur :
307 1 Daniel Dehennin
<pre>
308 1 Daniel Dehennin
git push origin HEAD
309 1 Daniel Dehennin
</pre>
310 1 Daniel Dehennin
311 1 Daniel Dehennin
Arrivé à ce stade il peut être intéressant d'utiliser @git-gui@ (@/usr/lib/git-core/git-gui@) ou @giggle@.
312 1 Daniel Dehennin
313 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@"
314 1 Daniel Dehennin
315 1 Daniel Dehennin
* Autres commandes de base :
316 1 Daniel Dehennin
<pre>
317 1 Daniel Dehennin
git log
318 1 Daniel Dehennin
git log --pretty=oneline --all
319 1 Daniel Dehennin
git diff
320 1 Daniel Dehennin
</pre>
321 1 Daniel Dehennin
322 1 Daniel Dehennin
323 1 Daniel Dehennin
h2. Branches distantes
324 1 Daniel Dehennin
325 1 Daniel Dehennin
* Si vous avez déjà cloné le master d'un projet, pour visualiser les branches disponibles :
326 1 Daniel Dehennin
<pre>
327 1 Daniel Dehennin
git branch -a
328 1 Daniel Dehennin
</pre>
329 1 Daniel Dehennin
devrait renvoyer quelque chose comme ceci :
330 1 Daniel Dehennin
<pre>
331 1 Daniel Dehennin
* master
332 1 Daniel Dehennin
  remotes/origin/2.2
333 1 Daniel Dehennin
  remotes/origin/HEAD -> origin/master
334 1 Daniel Dehennin
  remotes/origin/master
335 1 Daniel Dehennin
  remotes/origin/upstream
336 1 Daniel Dehennin
</pre>
337 1 Daniel Dehennin
338 1 Daniel Dehennin
* Pour récupérer la branche 2.2 :
339 1 Daniel Dehennin
<pre>
340 1 Daniel Dehennin
git co 2.2
341 1 Daniel Dehennin
</pre>
342 1 Daniel Dehennin
va récupérer la branche 2.2 auprès du serveur origin.
343 1 Daniel Dehennin
Une autre méthode:
344 1 Daniel Dehennin
<pre>
345 1 Daniel Dehennin
git branch --track 2.2 remotes/origin/2.2
346 1 Daniel Dehennin
</pre>
347 1 Daniel Dehennin
348 1 Daniel Dehennin
h1. Merge
349 1 Daniel Dehennin
350 1 Daniel Dehennin
Fusion : action consistant à fusionner une branche avec une autre ("mabranche" avec @master@ par exemple)
351 1 Daniel Dehennin
352 1 Daniel Dehennin
Exemple : @merge@ de la branche *mabranche* dans la branche *master* 
353 1 Daniel Dehennin
354 1 Daniel Dehennin
* Se placer dans la branche @master@ :
355 1 Daniel Dehennin
<pre>
356 1 Daniel Dehennin
git checkout master
357 1 Daniel Dehennin
git merge mabranche
358 1 Daniel Dehennin
</pre>
359 1 Daniel Dehennin
360 3 Fabrice Barconnière
*remarque* : après un @merge@ réussi, il n'y a pas de @commit@ à faire.
361 1 Daniel Dehennin
362 1 Daniel Dehennin
Si vous n'êtes pas satisfait du @merge@, il faut revenir en arrière avec un 
363 1 Daniel Dehennin
<pre>
364 1 Daniel Dehennin
git reset --hard
365 1 Daniel Dehennin
</pre>
366 1 Daniel Dehennin
367 1 Daniel Dehennin
**Résoudre un conflit de @merge@**
368 1 Daniel Dehennin
369 1 Daniel Dehennin
Si lors d'un @merge@ il y a eu un problème du type :
370 1 Daniel Dehennin
<pre>
371 1 Daniel Dehennin
Auto-merged file.txt
372 1 Daniel Dehennin
CONFLICT (content): Merge conflict in file.txt
373 1 Daniel Dehennin
Automatic merge failed; fix conflicts and then commit the result.
374 1 Daniel Dehennin
</pre> et que
375 1 Daniel Dehennin
<pre>
376 1 Daniel Dehennin
git commit
377 2 Fabrice Barconnière
</pre> répond qu'il reste des fichiers à merger (unresolved merge), *Il n'y a donc pas eu de commit*
378 1 Daniel Dehennin
de même qu'un
379 1 Daniel Dehennin
<pre>
380 1 Daniel Dehennin
git status
381 1 Daniel Dehennin
</pre>
382 1 Daniel Dehennin
383 1 Daniel Dehennin
Il faut alors éditer le fichier concerné, résoudre le conflit à la main et faire un nouveau un @commit@ :
384 1 Daniel Dehennin
<pre>
385 1 Daniel Dehennin
git add [file.txt]
386 1 Daniel Dehennin
git commit
387 1 Daniel Dehennin
</pre>
388 1 Daniel Dehennin
389 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 ;)
390 1 Daniel Dehennin
391 1 Daniel Dehennin
* Pour repérer les fichiers qui n'ont pas été fusionné :
392 1 Daniel Dehennin
<pre>
393 1 Daniel Dehennin
git ls-files --unmerged
394 1 Daniel Dehennin
</pre>
395 1 Daniel Dehennin
396 1 Daniel Dehennin
397 1 Daniel Dehennin
398 1 Daniel Dehennin
399 1 Daniel Dehennin
h1. Stash
400 1 Daniel Dehennin
401 1 Daniel Dehennin
*git stash* permet de sauvegarder des modifications locales afin de les appliquer plus tard.
402 1 Daniel Dehennin
403 1 Daniel Dehennin
* Sauvegarde des modifications :
404 1 Daniel Dehennin
<pre>
405 1 Daniel Dehennin
# git stash save "en attente"
406 1 Daniel Dehennin
Saved working directory and index state On master: en attente
407 1 Daniel Dehennin
</pre>
408 1 Daniel Dehennin
* Liste des modifications sauvegardées :
409 1 Daniel Dehennin
<pre>
410 1 Daniel Dehennin
git stash list
411 1 Daniel Dehennin
stash@{0}: On master: en attente
412 1 Daniel Dehennin
</pre>
413 1 Daniel Dehennin
* Revenir à l'état sauvegardé (_stash@{1}_ pour restaurer la 2ème sauvegarde) :
414 1 Daniel Dehennin
<pre>
415 1 Daniel Dehennin
git stash apply [stash@{0}]
416 1 Daniel Dehennin
</pre>
417 1 Daniel Dehennin
* Nettoyer la liste des sauvegarde :
418 1 Daniel Dehennin
<pre>
419 1 Daniel Dehennin
git stash clear
420 1 Daniel Dehennin
</pre>
421 1 Daniel Dehennin
422 1 Daniel Dehennin
423 1 Daniel Dehennin
424 1 Daniel Dehennin
h1. Message de commit
425 1 Daniel Dehennin
426 1 Daniel Dehennin
*IMPORTANT* : ne pas effectuer de modifications sur des commits déjà envoyés sur le serveur origin (le dépot).
427 1 Daniel Dehennin
428 1 Daniel Dehennin
Avant d'envoyer vos données sur le serveur, il est possible de modifier/améliorer les messages de commit.
429 1 Daniel Dehennin
430 1 Daniel Dehennin
h2. Modifier le dernier message de commit
431 1 Daniel Dehennin
432 1 Daniel Dehennin
<pre>
433 1 Daniel Dehennin
git commit --amend
434 1 Daniel Dehennin
</pre>
435 1 Daniel Dehennin
Modifier, sauvegarder et quitter.
436 1 Daniel Dehennin
437 1 Daniel Dehennin
h2. Modifier les trois derniers messages
438 1 Daniel Dehennin
439 1 Daniel Dehennin
* On lance un rebase
440 1 Daniel Dehennin
<pre>
441 1 Daniel Dehennin
git rebase -i HEAD~3
442 1 Daniel Dehennin
</pre>
443 1 Daniel Dehennin
* Un éditeur de texte s'ouvre avec quelque chose qui ressemble à ça:
444 1 Daniel Dehennin
<pre>
445 1 Daniel Dehennin
pick 6ffa65b update des bases de donnees editable=0 et pas 2
446 1 Daniel Dehennin
pick 9697740 update des bases vers 2.2.3 : nettoyage et ajout d'un __init__.py (ref #11)
447 1 Daniel Dehennin
pick e56a7a4 Configuration des bases de donnees pour le passage en version 2.2.3 (fixes #11 : fixé)
448 1 Daniel Dehennin
449 1 Daniel Dehennin
# Rebase cd9333c..e56a7a4 onto cd9333c
450 1 Daniel Dehennin
#
451 1 Daniel Dehennin
# Commands:
452 1 Daniel Dehennin
#  p, pick = use commit
453 1 Daniel Dehennin
#  r, reword = use commit, but edit the commit message
454 1 Daniel Dehennin
#  e, edit = use commit, but stop for amending
455 1 Daniel Dehennin
#  s, squash = use commit, but meld into previous commit
456 1 Daniel Dehennin
#
457 1 Daniel Dehennin
# If you remove a line here THAT COMMIT WILL BE LOST.
458 1 Daniel Dehennin
# However, if you remove everything, the rebase will be aborted.
459 1 Daniel Dehennin
#
460 1 Daniel Dehennin
</pre>
461 1 Daniel Dehennin
* Changer pick en edit sur les lignes correspondantes aux commit à modifier, par exemple :
462 1 Daniel Dehennin
<pre>
463 1 Daniel Dehennin
edit 6ffa65b update des bases de donnees editable=0 et pas 2
464 1 Daniel Dehennin
pick 9697740 update des bases vers 2.2.3 : nettoyage et ajout d'un __init__.py (ref #11)
465 1 Daniel Dehennin
pick e56a7a4 Configuration des bases de donnees pour le passage en version 2.2.3 (fixes #11 : fixé)
466 1 Daniel Dehennin
</pre>
467 1 Daniel Dehennin
* Sauver et quitter.
468 1 Daniel Dehennin
* Lancer la commande :
469 1 Daniel Dehennin
<pre>
470 1 Daniel Dehennin
git commit --amend
471 1 Daniel Dehennin
</pre>
472 1 Daniel Dehennin
* Modifier les messages de commit, par ex :
473 1 Daniel Dehennin
<pre>
474 1 Daniel Dehennin
update des bases de donnees editable=0 et pas 2 (ref #11)
475 1 Daniel Dehennin
</pre> 
476 1 Daniel Dehennin
* Sauvegarder et quitter
477 1 Daniel Dehennin
* Lancer la commande :
478 1 Daniel Dehennin
<pre>
479 1 Daniel Dehennin
git rebase --continue
480 1 Daniel Dehennin
</pre>
481 1 Daniel Dehennin
* Vérifier les messages de commit
482 1 Daniel Dehennin
<pre>
483 1 Daniel Dehennin
git log
484 1 Daniel Dehennin
</pre>
485 1 Daniel Dehennin
486 1 Daniel Dehennin
487 1 Daniel Dehennin
h2. Fusionner des commits
488 1 Daniel Dehennin
489 1 Daniel Dehennin
Il est possible de fusionner des commit afin d'éviter des commits multiples pour des modifications mineures.
490 1 Daniel Dehennin
* Lancer un git rebase
491 1 Daniel Dehennin
<pre>
492 1 Daniel Dehennin
git rebase -i HEAD~3
493 1 Daniel Dehennin
</pre>
494 1 Daniel Dehennin
<pre>
495 1 Daniel Dehennin
pick 16098ec Ajout d'icône gepi et cdt (ref #51)
496 1 Daniel Dehennin
pick f244e89 Deplacement d'icone
497 1 Daniel Dehennin
pick 7c8670c Deplacement des icones sources
498 1 Daniel Dehennin
499 1 Daniel Dehennin
# Rebase 5f5bfee..7c8670c onto 5f5bfee
500 1 Daniel Dehennin
#
501 1 Daniel Dehennin
# Commands:
502 1 Daniel Dehennin
#  p, pick = use commit
503 1 Daniel Dehennin
#  r, reword = use commit, but edit the commit message
504 1 Daniel Dehennin
#  e, edit = use commit, but stop for amending
505 1 Daniel Dehennin
#  s, squash = use commit, but meld into previous commit
506 1 Daniel Dehennin
#
507 1 Daniel Dehennin
# If you remove a line here THAT COMMIT WILL BE LOST.
508 1 Daniel Dehennin
# However, if you remove everything, the rebase will be aborted.
509 1 Daniel Dehennin
#
510 1 Daniel Dehennin
</pre>
511 1 Daniel Dehennin
512 1 Daniel Dehennin
* Changer pick en squash fusionne votre commit avec la ligne au-dessus
513 1 Daniel Dehennin
<pre>
514 1 Daniel Dehennin
pick 16098ec Ajout d'icône gepi et cdt (ref #51)
515 1 Daniel Dehennin
squash f244e89 Deplacement d'icone
516 1 Daniel Dehennin
squash 7c8670c Deplacement des icones sources
517 1 Daniel Dehennin
</pre>
518 1 Daniel Dehennin
* Sauver et quitter, Un éditeur s'ouvre:
519 1 Daniel Dehennin
<pre>
520 1 Daniel Dehennin
# This is a combination of 3 commits.
521 1 Daniel Dehennin
# The first commit's message is:
522 1 Daniel Dehennin
Ajout d'icône gepi et cdt (ref #51)
523 1 Daniel Dehennin
524 1 Daniel Dehennin
# This is the 2nd commit message:
525 1 Daniel Dehennin
526 1 Daniel Dehennin
Deplacement d'icone
527 1 Daniel Dehennin
528 1 Daniel Dehennin
# This is the 3rd commit message:
529 1 Daniel Dehennin
530 1 Daniel Dehennin
Deplacement des icones sources
531 1 Daniel Dehennin
532 1 Daniel Dehennin
# Please enter the commit message for your changes. Lines starting
533 1 Daniel Dehennin
# with '#' will be ignored, and an empty message aborts the commit.
534 1 Daniel Dehennin
# Not currently on any branch.
535 1 Daniel Dehennin
# Changes to be committed:
536 1 Daniel Dehennin
#   (use "git reset HEAD <file>..." to unstage)
537 1 Daniel Dehennin
#
538 1 Daniel Dehennin
#       modified:   eole/tmpls/update_creole_posh.sql
539 1 Daniel Dehennin
#       renamed:    plugins/plugin_desktop/icones/old/Corbeille.png -> plugins/plugin_desktop/icones/Corbeille.png
540 1 Daniel Dehennin
#       renamed:    plugins/plugin_desktop/icones/old/Courrier.png -> plugins/plugin_desktop/icones/Courrier.png
541 1 Daniel Dehennin
#       renamed:    plugins/plugin_desktop/icones/old/agenda.png -> plugins/plugin_desktop/icones/agenda.png
542 1 Daniel Dehennin
#       new file:   plugins/plugin_desktop/icones/cdt.png
543 1 Daniel Dehennin
#       modified:   plugins/plugin_desktop/icones/dir.png
544 1 Daniel Dehennin
#       modified:   plugins/plugin_desktop/icones/gepi.png
545 1 Daniel Dehennin
#       renamed:    plugins/plugin_desktop/icones/old/mail.jpg -> plugins/plugin_desktop/icones/mail.jpg
546 1 Daniel Dehennin
#       modified:   plugins/plugin_desktop/icones/mail.png
547 1 Daniel Dehennin
#       new file:   sources-desktop/icones/cdt.xcf
548 1 Daniel Dehennin
#       renamed:    plugins/plugin_desktop/icones/grand/moodle.gif -> sources-desktop/icones/moodle.gif
549 1 Daniel Dehennin
#
550 1 Daniel Dehennin
# Untracked files:
551 1 Daniel Dehennin
#   (use "git add <file>..." to include in what will be committed)
552 1 Daniel Dehennin
#
553 1 Daniel Dehennin
#       databases/bdd/scribe-posh.sql.sav
554 1 Daniel Dehennin
</pre>
555 1 Daniel Dehennin
* Éditer les messages (un message suffit)
556 1 Daniel Dehennin
<pre>
557 1 Daniel Dehennin
# The first commit's message is:
558 1 Daniel Dehennin
Ajout d'icône pour les applications scribe (ref #51)
559 1 Daniel Dehennin
# This is the 2nd commit message:
560 1 Daniel Dehennin
561 1 Daniel Dehennin
# This is the 3rd commit message:
562 1 Daniel Dehennin
563 1 Daniel Dehennin
# Please enter the commit message for your changes. Lines starting
564 1 Daniel Dehennin
</pre>
565 1 Daniel Dehennin
* Sauver et quitter
566 1 Daniel Dehennin
* Vérifier que cela ressemble bien à ce que vous voulez
567 1 Daniel Dehennin
<pre>
568 1 Daniel Dehennin
git log
569 1 Daniel Dehennin
</pre>
570 1 Daniel Dehennin
571 1 Daniel Dehennin
572 1 Daniel Dehennin
h1. Trucs et astuces
573 1 Daniel Dehennin
574 1 Daniel Dehennin
* Résoudre un signalement avec l'ajout de "fixes #<numéro du signalement>"
575 1 Daniel Dehennin
<pre>
576 1 Daniel Dehennin
git commit -m"La nouvelle feature fixes #<numéro du signalement>"
577 1 Daniel Dehennin
git push ....
578 1 Daniel Dehennin
</pre>
579 1 Daniel Dehennin
580 1 Daniel Dehennin
* Faire référence à un signalement
581 1 Daniel Dehennin
<pre>
582 1 Daniel Dehennin
git commit -m"bla bla bal du bug #<numéro du signalement>"
583 1 Daniel Dehennin
</pre>
584 1 Daniel Dehennin
585 1 Daniel Dehennin
* Activer la coloration syntaxique 
586 1 Daniel Dehennin
<pre>
587 1 Daniel Dehennin
git config --global color.ui true
588 1 Daniel Dehennin
</pre>
589 1 Daniel Dehennin
590 1 Daniel Dehennin
* Pour controler les fichiers à ne JAMAIS prendre en compte (@commit@), utiliser le fichier @~/.gitignore@. Exemple d'un fichier @~/.gitignore@ :
591 1 Daniel Dehennin
<pre>
592 1 Daniel Dehennin
# ignorer le fichier lui même
593 1 Daniel Dehennin
.gitignore
594 1 Daniel Dehennin
# les fichiers de sauvegarde VIM
595 1 Daniel Dehennin
*~
596 1 Daniel Dehennin
# ignorer les fichiers html générés
597 1 Daniel Dehennin
*.html
598 1 Daniel Dehennin
# sauf mon_fichier.html que je veux prendre en compte
599 1 Daniel Dehennin
!mon_fichier.html
600 1 Daniel Dehennin
# ignorer les dossiers @.svn@
601 1 Daniel Dehennin
.svn
602 1 Daniel Dehennin
# ignore documentation buid html files
603 1 Daniel Dehennin
.build
604 1 Daniel Dehennin
</pre>
605 1 Daniel Dehennin
606 8 Gérald Schwartzmann
De nombreux exemples de gitignore en fonction des applications et des frameworks : https://github.com/github/gitignore
607 8 Gérald Schwartzmann
608 1 Daniel Dehennin
* Le fichier @~/.gitconfig@ peut permettre d'éviter de taper trop au clavier :
609 1 Daniel Dehennin
<pre>
610 1 Daniel Dehennin
[alias]
611 1 Daniel Dehennin
      st = status
612 1 Daniel Dehennin
      di = diff
613 1 Daniel Dehennin
      co = checkout
614 1 Daniel Dehennin
      ci = commit
615 1 Daniel Dehennin
      br = branch
616 1 Daniel Dehennin
      sta = stash
617 1 Daniel Dehennin
</pre>
618 1 Daniel Dehennin
619 1 Daniel Dehennin
* Pour éviter de taper l'URL et son mot de passe à chaque @push@ et @pull@, il faut :
620 1 Daniel Dehennin
621 1 Daniel Dehennin
 * configurer l'URL du projet
622 1 Daniel Dehennin
<pre>
623 1 Daniel Dehennin
git config remote.origin.url http://194.167.18.22/git/projet/
624 1 Daniel Dehennin
git config remote.origin.mirror false
625 1 Daniel Dehennin
</pre>
626 1 Daniel Dehennin
 * renseigner le fichier @~/.netrc@ :
627 1 Daniel Dehennin
<pre>
628 1 Daniel Dehennin
machine dev-eole.ac-dijon.fr
629 1 Daniel Dehennin
login monlogin
630 1 Daniel Dehennin
password monmotdepasse
631 1 Daniel Dehennin
</pre>
632 1 Daniel Dehennin
 * paramétrer les droits du fichier @~/.netrc@ :
633 1 Daniel Dehennin
<pre>
634 1 Daniel Dehennin
chmod 600 ~/.netrc
635 1 Daniel Dehennin
</pre>
636 1 Daniel Dehennin
Ensuite @git push@ et @git pull@ ne posent plus de questions.
637 1 Daniel Dehennin
638 1 Daniel Dehennin
639 1 Daniel Dehennin
* Pour faire le ménage :
640 1 Daniel Dehennin
<pre>
641 1 Daniel Dehennin
git repack
642 1 Daniel Dehennin
git prune
643 1 Daniel Dehennin
</pre>
644 1 Daniel Dehennin
645 1 Daniel Dehennin
* Pour repérer des @commit@ dans des branches qui n'ont pas été fusionnés (@merge@) dans la branche principale :
646 1 Daniel Dehennin
* Pour voir les @commit@ dans la branche *ma_branche* qui n'ont pas été fusionnés (@merge@) dans *master* : 
647 1 Daniel Dehennin
<pre>
648 1 Daniel Dehennin
git cherry -v master ma_branche
649 1 Daniel Dehennin
</pre>
650 1 Daniel Dehennin
651 1 Daniel Dehennin
h1. De subversion vers git
652 1 Daniel Dehennin
653 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 :
654 1 Daniel Dehennin
<pre>
655 1 Daniel Dehennin
rm mon_fichier
656 1 Daniel Dehennin
svn update
657 1 Daniel Dehennin
</pre>
658 1 Daniel Dehennin
659 1 Daniel Dehennin
A la place, il faut faire
660 1 Daniel Dehennin
<pre>
661 1 Daniel Dehennin
git checkout mon_fichier
662 1 Daniel Dehennin
</pre>
663 1 Daniel Dehennin
664 1 Daniel Dehennin
Pour revenir à un checkout frais dans le projet entier, utiliser *@reset@*. On peut annuler un commit en faisant :
665 1 Daniel Dehennin
666 1 Daniel Dehennin
<pre>
667 1 Daniel Dehennin
git reset --hard HEAD
668 1 Daniel Dehennin
</pre>
669 1 Daniel Dehennin
670 1 Daniel Dehennin
h1. De bazaar vers git
671 1 Daniel Dehennin
672 1 Daniel Dehennin
Il est possible de suivre un projet [[bzr depuis git]] grâce à un plugin.
673 1 Daniel Dehennin
674 1 Daniel Dehennin
Certains logiciels sont ainsi suivi au sein du projet EOLE.
675 1 Daniel Dehennin
676 1 Daniel Dehennin
h1. Créer un patch et l'intégrer
677 1 Daniel Dehennin
678 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").
679 1 Daniel Dehennin
680 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@) :
681 1 Daniel Dehennin
<pre>
682 1 Daniel Dehennin
git diff master [nom-de-branche]  > file.patch
683 1 Daniel Dehennin
</pre>
684 1 Daniel Dehennin
685 1 Daniel Dehennin
* Une fois le patch récupéré, pour l'inclure dans la branche *master* :
686 1 Daniel Dehennin
687 1 Daniel Dehennin
<pre>
688 1 Daniel Dehennin
git apply --stat file.patch
689 1 Daniel Dehennin
git apply --check file.patch
690 1 Daniel Dehennin
</pre> permet de tester le patch, et :
691 1 Daniel Dehennin
<pre>
692 1 Daniel Dehennin
git apply file.patch
693 1 Daniel Dehennin
</pre> permet de l'appliquer
694 1 Daniel Dehennin
695 1 Daniel Dehennin
h1. Tags
696 1 Daniel Dehennin
697 1 Daniel Dehennin
698 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).
699 1 Daniel Dehennin
700 1 Daniel Dehennin
Une branche est modifiable, un tag ne l'est pas. 
701 1 Daniel Dehennin
702 1 Daniel Dehennin
* Création du @tag@ :
703 1 Daniel Dehennin
<pre>
704 1 Daniel Dehennin
git tag mon-premier-tag
705 1 Daniel Dehennin
</pre>
706 1 Daniel Dehennin
707 1 Daniel Dehennin
* Liste des tags :
708 1 Daniel Dehennin
<pre>
709 1 Daniel Dehennin
git tag
710 1 Daniel Dehennin
</pre>
711 1 Daniel Dehennin
712 1 Daniel Dehennin
* Commit d'un @tag@ :
713 1 Daniel Dehennin
<pre>
714 1 Daniel Dehennin
git push --tags http://login@dev-eole.ac-dijon.fr/git/sandbox
715 1 Daniel Dehennin
</pre>
716 1 Daniel Dehennin
717 1 Daniel Dehennin
 * ou bien :
718 1 Daniel Dehennin
<pre>
719 1 Daniel Dehennin
git push http://login@dev-eole.ac-dijon.fr/git/sandbox <nom_tag>
720 1 Daniel Dehennin
</pre>
721 1 Daniel Dehennin
722 1 Daniel Dehennin
 * ou encore :
723 1 Daniel Dehennin
<pre>
724 1 Daniel Dehennin
git push http://login@dev-eole.ac-dijon.fr/git/sandbox <nom_branche> <nom_tag>
725 1 Daniel Dehennin
</pre>
726 1 Daniel Dehennin
727 1 Daniel Dehennin
* Recupérer un @tag@ :
728 1 Daniel Dehennin
<pre>
729 1 Daniel Dehennin
git checkout tags/<nom_tag>
730 1 Daniel Dehennin
</pre>
731 1 Daniel Dehennin
732 1 Daniel Dehennin
* Pour voir quel @commit@ exactement a été taggé :
733 1 Daniel Dehennin
<pre>
734 1 Daniel Dehennin
git show <nom_tag>
735 1 Daniel Dehennin
</pre>