Projet

Général

Profil

GitTrucsEtAstuces » Historique » Version 6

Lionel Morin, 21/02/2012 10:36

1 1 Daniel Dehennin
{{toc}}
2 1 Daniel Dehennin
3 1 Daniel Dehennin
h1. Tu balises quand tu commit ?
4 1 Daniel Dehennin
5 1 Daniel Dehennin
h2. Objectif
6 1 Daniel Dehennin
7 3 Daniel Dehennin
Montrer au monde une ligne de développement cohérente et compréhensible.
8 1 Daniel Dehennin
9 3 Daniel Dehennin
Cela se fait en deux temps :
10 3 Daniel Dehennin
# Identifier les modifications le plus finement possible lors du développement
11 3 Daniel Dehennin
# Grouper les modifications de façon logique pour la publication
12 1 Daniel Dehennin
13 4 Daniel Dehennin
Lors du développement, on va faire des commits le plus souvent possible, cela permet de _voir_ et _agencer_ les évolutions au cours du développement.
14 3 Daniel Dehennin
15 3 Daniel Dehennin
Afin de ne pas se surcharger inutilement et donc se décourager à faire des commits souvent, on pourra faire une exception [[GitBonnesPratiques#De-l’écriture-des-ChangeLog|à la bonne écriture des ChangeLogs]] sur ces branches privées dédiées au développement et utiliser l’option *-m* de @git commit@.
16 3 Daniel Dehennin
17 3 Daniel Dehennin
En revanche, avant la publication, il faut tout remettre en ordre :
18 3 Daniel Dehennin
* Regrouper les commits entre eux de façon logique
19 3 Daniel Dehennin
* Réécrire les [[GitBonnesPratiques#De-l’écriture-des-ChangeLog|ChangeLog]]
20 3 Daniel Dehennin
21 1 Daniel Dehennin
h2. N’ayons peur de rien, balisons !
22 3 Daniel Dehennin
23 1 Daniel Dehennin
L’écriture de [[GitBonnesPratiques#De-l’écriture-des-ChangeLog|ChangeLog]] sur une seule ligne nous fait perdre de l’information, on se contentera donc du minimum nécessaire afin de s’y retrouver lors de la phase de réécriture des [[GitBonnesPratiques#De-l’écriture-des-ChangeLog|ChangeLog]] :
24 3 Daniel Dehennin
# Une balise pour cataloguer ce commit
25 4 Daniel Dehennin
# La raison de la modification du commit
26 3 Daniel Dehennin
27 4 Daniel Dehennin
On peut ainsi mettre de côté des commits qui ne font que corriger des typos dans du code qui n’est pas le nôtre, l’idée est :
28 3 Daniel Dehennin
* Corriger tout ce que l’on voit, si personne d’autre ne l’a déjà fait, alors ça sera fait
29 3 Daniel Dehennin
* Ne pas se donner du travail supplémentaire à gérer des conflits pour des corrections typographiques et/ou mineures.
30 1 Daniel Dehennin
31 1 Daniel Dehennin
h3. Les commits de notre code
32 1 Daniel Dehennin
33 1 Daniel Dehennin
Différents types de commit :
34 6 Lionel Morin
* Le commit qui introduit de nouvelles choses (N: New) : quand on est super fort, on ne fait que ce type de commits, mais quand on est super fort, on a pas besoin de git ;-) ;
35 1 Daniel Dehennin
* Le commit qui corrige un problème fonctionnel dans le nouveau code introduit par le type ci-dessus (F: Fix) : et oui, ça arrive d’oublier des ", ) ou ] ;
36 1 Daniel Dehennin
* Le commit qui corrige un problème cosmétique (C: Cosmetic) de notre travail, décomposé en 2 sous catégories :
37 1 Daniel Dehennin
** La correction des messages visibles par l’utilisateur (C: print:) ;
38 1 Daniel Dehennin
** La correction des commentaires (C: #:).
39 1 Daniel Dehennin
40 6 Lionel Morin
Voici un exemple type de messages de log court pour une nouvelle fonctionnalité :
41 1 Daniel Dehennin
<pre>
42 1 Daniel Dehennin
  moi@work:~/src/bidule(moi/voyant-qui-clignote)$ git log --oneline master..HEAD
43 6 Lionel Morin
  ed002ff N: Ajout de la bibliothèque de gestion du voyant qui clignote
44 1 Daniel Dehennin
  7610ac6 F: Oublie d’une ) lors de l’appel à ->new()
45 1 Daniel Dehennin
  c44649d C: #: Mauvaise tournure de phrase: le voyant qui clignote est obligatoire
46 1 Daniel Dehennin
  2ed9b43 C: print: Typo: 3e personne du pluriel == ent
47 1 Daniel Dehennin
</pre>
48 1 Daniel Dehennin
49 1 Daniel Dehennin
Le balisage de chaque commit permet de facilement s’y retrouver lors de la réorganisation des commits pour [[GitBonnesPratiques#Publication-du-développement|publication]] :
50 6 Lionel Morin
* Les commits № 7610ac6, c44649d et 2ed9b43 doivent être fusionnés avec le commit № ed002ff et leurs messages de commit supprimés
51 1 Daniel Dehennin
52 1 Daniel Dehennin
h3. Les commits du code des autres
53 1 Daniel Dehennin
54 1 Daniel Dehennin
Il est possible, et vivement recommandé par moi-même, d’introduire une autre série de balises pour tout ce qui est correction en dehors de notre travail en cours.
55 1 Daniel Dehennin
56 1 Daniel Dehennin
C’est à dire, la correction des problèmes qui étaient déjà présents avant de faire la nouvelle branche.
57 1 Daniel Dehennin
58 1 Daniel Dehennin
* Le commit qui corrige un problème fonctionnel (Fo: Fix other) ;
59 1 Daniel Dehennin
* Le commit qui corrige un problème cosmétique (Co: Cosmetic other), décomposé en 2 sous catégories :
60 1 Daniel Dehennin
** La correction des messages visibles par l’utilisateur (Co: print:) ;
61 1 Daniel Dehennin
** La correction des commentaires (Co: #:).
62 1 Daniel Dehennin
63 1 Daniel Dehennin
Il est ainsi aisé de savoir quels commits il faut fusionner et quels commits restent autonommes :
64 1 Daniel Dehennin
<pre>
65 1 Daniel Dehennin
  moi@work:~/src/bidule(moi/voyant-qui-clignote)$ git log --oneline master..HEAD
66 6 Lionel Morin
  ed002ff N: Ajout de la bibliothèque de gestion du voyant qui clignote
67 1 Daniel Dehennin
  7610ac6 F: Oublie d’une ) lors de l’appel à ->new()
68 1 Daniel Dehennin
  74fe39b Co: #: Erreur de description de la variable "remote" de la méthode Bidule::Truc::Machiner()
69 1 Daniel Dehennin
  c44649d C: #: Mauvaise tournure de phrase: le voyant qui clignote est obligatoire
70 1 Daniel Dehennin
  9972b58 Fo: La méthode Bidule::Truc::Biduler() n’étant jamais utilisée, personne n’a vu qu’elle ne fonctionnait pas
71 1 Daniel Dehennin
  9a6c6c9 Co: print: Typo: Correction du message de l’exception Bidule::Exception::NoBattery
72 1 Daniel Dehennin
  2ed9b43 C: print: Typo: 3e personne du pluriel == ent
73 1 Daniel Dehennin
</pre>
74 5 Daniel Dehennin
75 5 Daniel Dehennin
Dans le log précédent :
76 5 Daniel Dehennin
# On groupera les commits @ed002ff@, @7610ac6@, @c44649d@ et @2ed9b43@ au début en les fusionnant et supprimant leur message de log (« @squash@ »)
77 5 Daniel Dehennin
# On groupera les commits @74fe39b@, @9972b58@ et @9a6c6c9@ comme étant les plus récents sur la branches.
78 5 Daniel Dehennin
79 5 Daniel Dehennin
On peut ainsi :
80 5 Daniel Dehennin
# Dans un premier temps, faire un merge de la première moitié de l’historique de cette branche dans la branche de publication pour publier notre travail.
81 5 Daniel Dehennin
# Dans un second temps, faire un merge du reste de cette branche dans la branche de publication pour publier les autres modifications
82 1 Daniel Dehennin
83 1 Daniel Dehennin
h2. Comment s’en servir ?
84 1 Daniel Dehennin
85 1 Daniel Dehennin
Lors d’un @git rebase -i HEAD~7@, l’éditeur est lancé avec le contenu suivant :
86 1 Daniel Dehennin
<pre>
87 1 Daniel Dehennin
  moi@work:~/src/bidule(moi/voyant-qui-clignote)$ git rebase -i HEAD~7
88 6 Lionel Morin
  pick ed002ff N: Ajout de la bibliothèque de gestion du voyant qui clignote
89 1 Daniel Dehennin
  pick 7610ac6 F: Oublie d’une ) lors de l’appel à ->new()
90 1 Daniel Dehennin
  pick 74fe39b Co: #: Erreur de description de la variable "remote" de la méthode Bidule::Truc::Machiner()
91 1 Daniel Dehennin
  pick c44649d C: #: Mauvaise tournure de phrase: le voyant qui clignote est obligatoire
92 1 Daniel Dehennin
  pick 9972b58 Fo: La méthode Bidule::Truc::Biduler() n’étant jamais utilisée, personne n’a vu qu’elle ne fonctionnait pas
93 1 Daniel Dehennin
  pick 9a6c6c9 Co: print: Typo: Correction du message de l’exception Bidule::Exception::NoBattery
94 1 Daniel Dehennin
  pick 2ed9b43 C: print: Typo: 3e personne du pluriel == ent
95 1 Daniel Dehennin
  # Rebase ed002ff..2ed9b43 onto ed002ff
96 1 Daniel Dehennin
  #
97 1 Daniel Dehennin
  # Commands:
98 1 Daniel Dehennin
  #  p, pick = use commit
99 1 Daniel Dehennin
  #  r, reword = use commit, but edit the commit message
100 1 Daniel Dehennin
  #  e, edit = use commit, but stop for amending
101 1 Daniel Dehennin
  #  s, squash = use commit, but meld into previous commit
102 1 Daniel Dehennin
  #  f, fixup = like "squash", but discard this commit's log message
103 1 Daniel Dehennin
  #  x, exec = run command (the rest of the line) using shell
104 1 Daniel Dehennin
  #
105 1 Daniel Dehennin
  # If you remove a line here THAT COMMIT WILL BE LOST.
106 1 Daniel Dehennin
  # However, if you remove everything, the rebase will be aborted.
107 1 Daniel Dehennin
  #
108 1 Daniel Dehennin
</pre>
109 1 Daniel Dehennin
110 6 Lionel Morin
Il est ainsi possible de *fusionner* les 4 commits qui nous concernent en un seul en déplaçant les lignes et en leur appliquant la commande de "fixup" :
111 1 Daniel Dehennin
112 1 Daniel Dehennin
<pre>
113 1 Daniel Dehennin
  moi@work:~/src/bidule(moi/voyant-qui-clignote)$ git rebase -i HEAD~7
114 6 Lionel Morin
  pick ed002ff N: Ajout de la bibliothèque de gestion du voyant qui clignote
115 1 Daniel Dehennin
  f 7610ac6 F: Oublie d’une ) lors de l’appel à ->new()
116 1 Daniel Dehennin
  f c44649d C: #: Mauvaise tournure de phrase: le voyant qui clignote est obligatoire
117 1 Daniel Dehennin
  f 2ed9b43 C: print: Typo: 3e personne du pluriel == ent
118 1 Daniel Dehennin
  pick 74fe39b Co: #: Erreur de description de la variable "remote" de la méthode Bidule::Truc::Machiner()
119 1 Daniel Dehennin
  pick 9972b58 Fo: La méthode Bidule::Truc::Biduler() n’étant jamais utilisée, personne n’a vu qu’elle ne fonctionnait pas
120 1 Daniel Dehennin
  pick 9a6c6c9 Co: print: Typo: Correction du message de l’exception Bidule::Exception::NoBattery
121 1 Daniel Dehennin
  # Rebase ed002ff..2ed9b43 onto ed002ff
122 1 Daniel Dehennin
  #
123 1 Daniel Dehennin
  # Commands:
124 1 Daniel Dehennin
  #  p, pick = use commit
125 1 Daniel Dehennin
  #  r, reword = use commit, but edit the commit message
126 1 Daniel Dehennin
  #  e, edit = use commit, but stop for amending
127 1 Daniel Dehennin
  #  s, squash = use commit, but meld into previous commit
128 1 Daniel Dehennin
  #  f, fixup = like "squash", but discard this commit's log message
129 1 Daniel Dehennin
  #  x, exec = run command (the rest of the line) using shell
130 1 Daniel Dehennin
  #
131 1 Daniel Dehennin
  # If you remove a line here THAT COMMIT WILL BE LOST.
132 1 Daniel Dehennin
  # However, if you remove everything, the rebase will be aborted.
133 1 Daniel Dehennin
  #
134 1 Daniel Dehennin
</pre>
135 1 Daniel Dehennin
136 1 Daniel Dehennin
Une fois la mise au propre de notre historique faite, nous souhaitons publier ces modifications.
137 1 Daniel Dehennin
138 1 Daniel Dehennin
Nous allons donc rebaser notre travail sur la branche @origin/master@ :
139 1 Daniel Dehennin
140 1 Daniel Dehennin
# On commence par télécharger les éventuels modifications :
141 1 Daniel Dehennin
<pre>
142 1 Daniel Dehennin
  moi@work:~/src/bidule(moi/voyant-qui-clignote)$ git fetch origin
143 1 Daniel Dehennin
  remote: Counting objects: 24, done.
144 1 Daniel Dehennin
  remote: Compressing objects: 100% (15/15), done.
145 1 Daniel Dehennin
  remote: Total 15 (delta 12), reused 0 (delta 0)
146 1 Daniel Dehennin
  Unpacking objects: 100% (15/15), done.
147 1 Daniel Dehennin
  From git://far-far.away.example.net/bidule.git
148 1 Daniel Dehennin
     7ced305..9171f31  master     -> origin/master
149 1 Daniel Dehennin
</pre>
150 1 Daniel Dehennin
# On rebase en modifiant les messages de commit afin de supprimer le balisage, il n’y a rien à fusionner :
151 1 Daniel Dehennin
<pre>
152 1 Daniel Dehennin
  moi@work:~/src/bidule(moi/voyant-qui-clignote)$ git rebase origin/master
153 6 Lionel Morin
  r ed002ff N: Ajout de la bibliothèque de gestion du voyant qui clignote
154 1 Daniel Dehennin
  r 74fe39b Co: #: Erreur de description de la variable "remote" de la méthode Bidule::Truc::Machiner()
155 1 Daniel Dehennin
  r 9972b58 Fo: La méthode Bidule::Truc::Biduler() n’étant jamais utilisée, personne n’a vu qu’elle ne fonctionnait pas
156 1 Daniel Dehennin
  r 9a6c6c9 Co: print: Typo: Correction du message de l’exception Bidule::Exception::NoBattery
157 1 Daniel Dehennin
  # Rebase ed002ff..9a6c6c9 onto 9171f31
158 1 Daniel Dehennin
  #
159 1 Daniel Dehennin
  # Commands:
160 1 Daniel Dehennin
  #  p, pick = use commit
161 1 Daniel Dehennin
  #  r, reword = use commit, but edit the commit message
162 1 Daniel Dehennin
  #  e, edit = use commit, but stop for amending
163 1 Daniel Dehennin
  #  s, squash = use commit, but meld into previous commit
164 1 Daniel Dehennin
  #  f, fixup = like "squash", but discard this commit's log message
165 1 Daniel Dehennin
  #  x, exec = run command (the rest of the line) using shell
166 1 Daniel Dehennin
  #
167 1 Daniel Dehennin
  # If you remove a line here THAT COMMIT WILL BE LOST.
168 1 Daniel Dehennin
  # However, if you remove everything, the rebase will be aborted.
169 1 Daniel Dehennin
  #
170 1 Daniel Dehennin
</pre>
171 1 Daniel Dehennin
172 1 Daniel Dehennin
Si un conflit est détecté sur le commit *9a6c6c9 Co: print: Typo: Correction du message de l’exception Bidule::Exception::NoBattery*,
173 1 Daniel Dehennin
il suffira d’annuler le rebase avec @git rebase --abort@ et de le recommencer, cette fois ci en supprimant la ligne correspondante.