Dans mon précédent journal, j'ai clairement indiqué ma préférence sur les gestionnaires de versions distribués (comme Git), par rapport aux gestionnaires de versions centralisés (comme Subversion). Je n'avais alors pas justifié ma position, mais je souhaite maintenant le faire. C'est vrai ca, pourquoi Git* m'importe ?
Un des arguments souvent rencontrés pour justifier l'intérêt de Git est la vitesse des opérations. C'est vrai que c'est agréable de pouvoir commiter instantanément. Pourtant, je travaille régulièrement avec svn, et ce manque de rapidité n'est pas quelque chose qui me gêne beaucoup. Cet argument à lui seul ne suffit pas à justifier le passage de svn à Git.
Les gestionnaires de versions distribués permettent, par définition, de commiter depuis n'importe où (dans le train, le métro, l'avion, les toilettes, etc.). Pourtant, ce genre d'utilisations reste assez marginal, et à l'exception de quelques personnes, c'est une possibilité extrêmement peu utilisée.
On peut également reprocher certaines choses à svn (comme l'impossibilité d'annuler un commit), mais ce sont des choix de design de subversion, et un autre gestionnaire centralisé pourrait les corriger.
Pour ma part, je pense que le plus grand apport de git est son aspect distribué, ce qui permet de mettre entre toutes les mains un gestionnaire de versions avec ses avantages. Avec subversion, seules les personnes autorisées peuvent accéder au dépôt et créer des branches pour faire des essais. De l'autre coté, n'importe qui peut cloner un dépôt Git, créer sa branche expérimentale et continuer à suivre les développements fait sur le dépôt officiel.
Prenons un exemple (fictif) : je suis un utilisateur régulier du logiciel XYZ, j'en suis content, mais je n'arrive jamais à m'y retrouver dans l'écran des options. Je décide donc d'essayer de refaire cet écran, mais comme je passe beaucoup de temps sur la tribune, il va probablement me falloir plusieurs semaines avant de pouvoir proposer un patch à l'auteur.
Premier cas : le logiciel XYZ est versionné avec subversion. Je fais donc un checkout du trunk, et je commence à travailler dessus. Au bout de deux semaines, je commence à avoir une version intéressante de cet écran, mais entre temps, le développement a continué sur le trunk, et une nouvelle option est apparue. Je décide de faire un svn up, mais malheureusement, l'inévitable se produit : un conflit sur plusieurs fichiers. Ce n'est pas très grave, j'arrive à les corriger, et je peux me remettre au travail. J'arrive enfin à un écran des options qui me convient, et juste au moment où j'allais me décider à envoyer mon patch à l'auteur, je me dis que j'essayerais bien d'intervertir 2 options. Je fais ce dernier changement, mais pas le temps de le tester, je pars en vacances. A mon retour, je me rends compte qu'intervertir ces 2 options était une mauvaise idée. Malheureusement, comme je n'ai pas pu commité mes changements, je me retrouve à devoir me rappeler ce que j'avais fait avant de partir pour pouvoir annuler ces changements. Enfin, je peux proposer mon patch à l'auteur. Ouf.
Deuxième cas : je fais un svn export du même dépôt, puis je créé un dépôt svn local pour gérer mes avancées. Je peux tranquillement travailler sur mon écran d'options. Quand j'arrive à quelque chose de convaincant, je propose un patch à l'auteur, qui le refuse, car celui-ci ne s'applique pas sur le trunk. J'essaye alors de me synchroniser avec le dépôt officiel, mais entre les nombreux conflits et le trunk qui n'arrête pas d'évoluer, je finis par abandonner :(
Maintenant, le même scénario avec Git se serait beaucoup mieux passé. J'aurais profité de tous les avantages d'un code versionné. Par exemple, j'aurais pu commiter régulièrement mes avancées, ce qui m'aurais permis de profiter de git diff, git log, etc. Si, après récupéré les mises à jour du dépôt officiel, je me serais rendu compte que résoudre les conflits est plus compliqué que prévu, je peux retourner à la révision précédente et continuer à travailler dessus (en laissant le travail de résolution des conflits pour quand j'aurais plus de temps/volonté à y consacrer). Enfin, je n'aurais rencontré aucune difficulté à annuler un des mes changements. Bref, j'aurais pu profité des avantages d'un code versionné.
Ici, on peut assez facilement s'en sortir avec svn et quelques bidouillages (faire régulièrement des tarballs de ses avancées), mais imaginer que vous vouliez vous mettre à plusieurs pour proposer une nouvelle fonctionnalité majeure pour votre logiciel préféré. Bien entendu, vous n'avez pas accès au dépôt officiel, sinon ce serait trop simple ;)
Pour moi, la grande force des gestionnaires de versions distribués est là : pouvoir créer une branche même sans accès au dépôt officiel. Cette branche distante est la seule façon sereine de faire des développements expérimentaux tout en continuant à se synchroniser sur la base de code officielle. Les gestionnaires de versions distribués cassent cette barrière entre ceux qui ont accès au dépot officiel et les autres.
* je parle de Git, mais Mercurial ou Bazaar-NG ou un autre DSCM ferait aussi l'affaire.
> Lire le journal (64 commentaires, moyenne: 3,1).
Vous avez demandé le commentaire #914033.



mettre un tag
Avec svn, il manque une fonctionnalité de tag au sens CVS : mettre un tag manuellement sur un groupe de fichiers hors de la logique de version SVN.
Est-ce possible avec git ?
Exemple :
fichier1 : r100 (numero de version SVN)
fichier2 : r99
fichier3 : r103
fichier4 : r100
fichier5 : r101
Avec CVS on peut tagguer fichiers 1, 2, 3, (uniquement ces 3) avec TAG_V1 par exemple. et faire plus tard des update, checkout et diff par rapport à cette version TAG_V1.
Mais avec SVN ce n'est pas possible.
C'est très utile quand 2 développeurs travaillent en parallèle, et que certaines modifs de l'un doivent être livrées, alors que d'autres modifs de l'autre developpeur ne seront pas livrées tout de suite.
goeb
[^]Re: mettre un tag
Faire exactement ce que tu demandes, non, ce n'est pas possible, puisque git ne suit pas l'approche par fichiers.
Dans un cas comme celui-ci, tu vas simplement créer une nouvelle branche (appelons-la V1) et y merger ce qui t'intéresse. Et comme de toute façon, chacun des deux développeurs travaille dans sa branche, ce sera très facile à faire.
[^]Re: mettre un tag
Mmm... Je dirais mauvais principe de réflexion, changer le principe de réflexion plutôt que le logiciel.
Le gros problème de CVS est justement cette gestion par fichier : un tag peut alors être très incohérent, car le tag n'est pas précis dans le temps pour l'ensemble du logiciel.
Je suis passé il y a peu de CVS à SVN, ça m'a gonflé pas mal au début cette gestion des tags par la création obligatoire d'une branche pour le soft en entier, et puis... Après réflexion, c'est génial : c'est bien le soft en entier qu'on versionne, pas un fichier!
Dans ton exemple, TAG_V1 ne correspondrait pas un une V1 vraiment pendant que ton collègue n'a pas encore fait son patch. Ca serait inconsistant, une personne faisant un checkout sur ton soft en entier avec un filtre sur le Tag TAG_V1(qu'il verrait dans son gestionnaire, donc il se dira "super, la V1 est tagguée!) penserait avoir une V1, mais... Il lui manquera des fichiers, et ça ne compilera pas. Pas bon du tout.