Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Journal : Pourquoi Git m'importe ?

Posté par Bruno Michel (Jabber id, page perso, ) le 15 mars 2008

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 #914496.

Multiple repositories

Posté par glisse () le 17/03/2008 à 18:14. (lien). Évalué à 1.

Je rajouterai deux killer features (avec l'accent je vous prie) de git:

- Pouvoir facilement recuperer du code de differents repository du meme projet (je fais ca tout le temps):
git-clone git://anongit.fdo.org/git/mesa
cd mesa
git-remote add toto git://toto.org/git/mesa

Et hop on peut recuperer les branches de toto faire du cherry picking et compagnies. A si vous connaissez titi ben vous pourrez aussi faire la meme chose.

- Git bitsect très utile pour retrouver une régression.

Donc git c'est bien ;)

  • [^]Re: Multiple repositories

    Posté par Matthieu Moy (page perso, ) le 18/03/2008 à 09:28. (lien). Évalué à 1.

    Un détail : la syntaxe « git-clone » est dépréciée en faveur de « git clone » (avec un espace, pas un tiret).

    • [^]Re: Multiple repositories

      Posté par Alban Crequy (Jabber id, page perso, ) le 20/03/2008 à 23:32. (lien). Évalué à 1.

      Pourquoi? Je croyais que toutes les commandes "git foo" pouvaient aussi être utilisées avec "git-foo" et vice versa.

      Je préfère avec le tiret, ça fait des pages de man moins longues pour chaque commande.

      • [^]Re: Multiple repositories

        Posté par Matthieu Moy (page perso, ) le 21/03/2008 à 10:23. (lien). Évalué à 4.

        http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.5(...)

        Deprecation notices
        -------------------

        * From v1.6.0, git will by default install dashed form of commands
        (e.g. "git-commit") outside of users' normal $PATH, and will install
        only selected commands ("git" itself, and "gitk") in $PATH. This
        implies:

        - Using dashed forms of git commands (e.g. "git-commit") from the
        command line has been informally deprecated since early 2006, but
        now it officially is, and will be removed in the future. Use
        dash-less forms (e.g. "git commit") instead.

        - Using dashed forms from your scripts, without first prepending the
        return value from "git --exec-path" to the scripts' PATH, has been
        informally deprecated since early 2006, but now it officially is.

        - Use of dashed forms with "PATH=$(git --exec-path):$PATH; export
        PATH" early in your script is not deprecated with this change.

        Users are strongly encouraged to adjust their habits and scripts now
        to prepare for this change.


        Les raisons pour ça, entre autres :

        * Les git-bidule ne permettent pas les aliases. Par exemple, chez moi, « git st » fait « git status », mais pour que « git-st » le fasse aussi, Git ne peut pas.

        * Les git-bidule ne permettent pas les options globales, genre « git --no-pager foo ».