393 votes

Pourquoi Git est-il meilleur que Subversion ?

J'ai utilisé Subversion pendant quelques années et après avoir utilisé SourceSafe J'aime Subversion. Combiné avec TortoiseSVN je ne peux pas vraiment imaginer comment cela pourrait être mieux.

Pourtant, un nombre croissant de développeurs affirment que Subversion a des problèmes et que nous devrions passer à la nouvelle race de systèmes de contrôle de version distribués, tels que Git .

Comment Git améliore-t-il Subversion ?

548voto

Michael Stum Points 72046

Git n'est pas meilleur que Subversion. Mais il n'est pas non plus pire. C'est différent.

La différence essentielle est qu'il est décentralisé. Imaginez que vous êtes un développeur sur la route, que vous développez sur votre ordinateur portable et que vous voulez avoir le contrôle de la source pour pouvoir revenir 3 heures en arrière.

Avec Subversion, vous avez un problème : le dépôt SVN peut être dans un endroit que vous ne pouvez pas atteindre (dans votre entreprise, et vous n'avez pas internet en ce moment), vous ne pouvez pas commiter. Si vous voulez faire une copie de votre code, vous devez littéralement le copier/coller.

Avec Git, vous n'avez pas ce problème. Votre copie locale est un référentiel, et vous pouvez y commiter et bénéficier de tous les avantages du contrôle de source. Lorsque vous retrouvez la connectivité au dépôt principal, vous pouvez commiter sur celui-ci.

Cela semble bien au premier abord, mais gardez à l'esprit la complexité supplémentaire de cette approche.

Git semble être la chose "nouvelle, brillante et cool". Ce n'est en aucun cas mauvais (il y a une raison pour laquelle Linus l'a écrit pour le développement du noyau Linux après tout), mais j'ai l'impression que beaucoup de gens sautent dans le train du "contrôle de source distribué" juste parce que c'est nouveau et que c'est écrit par Linus Torvalds, sans vraiment savoir pourquoi/si c'est mieux.

Subversion a des problèmes, mais Git, Mercurial, CVS, TFS ou autre en ont aussi.

Edit : Cette réponse a maintenant un an et génère toujours de nombreux votes positifs, alors j'ai pensé ajouter quelques explications supplémentaires. Au cours de l'année écoulée depuis que j'ai écrit cette réponse, Git a gagné beaucoup de terrain et de soutien, en particulier depuis que des sites comme GitHub ont vraiment décollé. J'utilise à la fois Git et Subversion aujourd'hui et j'aimerais partager quelques informations personnelles.

Tout d'abord, Git peut être vraiment déroutant au début quand on travaille de manière décentralisée. Qu'est-ce qu'un dépôt distant ? et Comment configurer correctement le dépôt initial ? sont deux questions qui se posent au début, surtout en comparaison avec le simple "svnadmin create" de SVN, le "git init" de Git peut prendre les paramètres --bare et --shared qui semblent être la "bonne" façon de configurer un dépôt centralisé. Il y a des raisons pour cela, mais cela ajoute de la complexité. La documentation de la commande "checkout" est très confuse pour les personnes qui changent de méthode - la "bonne" méthode semble être "git clone", alors que "git checkout" semble changer de branche.

Git brille VRAIMENT lorsque vous êtes décentralisé. J'ai un serveur à la maison et un ordinateur portable sur la route, et SVN ne fonctionne tout simplement pas bien ici. Avec SVN, je ne peux pas avoir de contrôle de source local si je ne suis pas connecté au dépôt (Oui, je connais SVK ou les moyens de copier le dépôt). Avec Git, c'est le mode par défaut de toute façon. C'est une commande supplémentaire cependant (git commit commet localement, alors que git push origin master pousse la branche master vers la branche distante nommée "origin").

Comme dit plus haut : Git ajoute de la complexité. Deux modes de création de dépôts, checkout vs. clone, commit vs. push... Vous devez savoir quelles commandes fonctionnent localement et lesquelles fonctionnent avec "le serveur" (je suppose que la plupart des gens aiment encore un "master-repository" central).

En outre, l'outillage est encore insuffisant, du moins sous Windows. Oui, il existe un AddIn Visual Studio, mais j'utilise toujours git bash avec msysgit.

SVN a l'avantage d'être BEAUCOUP plus simple à apprendre : Il y a votre dépôt, toutes les modifications à y apporter, si vous savez comment créer, commiter et vérifier et vous êtes prêt à partir et vous pouvez récupérer des choses comme les branches, les mises à jour etc. plus tard.

Git a l'avantage d'être BEAUCOUP mieux adapté si certains développeurs ne sont pas toujours connectés au dépôt maître. De plus, il est beaucoup plus rapide que SVN. Et d'après ce que j'ai entendu, la prise en charge des branches et de la fusion est bien meilleure (ce qui est normal, puisque ce sont les raisons principales pour lesquelles il a été écrit).

Cela explique également pourquoi il fait tant parler de lui sur Internet, car Git est parfaitement adapté aux projets Open Source : Il suffit de le bifurquer, de livrer vos modifications dans votre propre bifurcation, puis de demander au responsable du projet original de reprendre vos modifications. Avec Git, cela fonctionne tout simplement. Vraiment, essayez-le sur Github, c'est magique.

Je vois aussi des passerelles Git-SVN : Le dépôt central est un dépôt Subversion, mais les développeurs travaillent localement avec Git et la passerelle pousse ensuite leurs modifications vers SVN.

Mais même avec ce long ajout, je reste fidèle à mon message principal : Git n'est pas meilleur ou pire, il est juste différent. Si vous avez besoin d'un "contrôle de source hors ligne" et que vous êtes prêt à passer un peu plus de temps à l'apprendre, c'est fantastique. Mais si vous avez un contrôle de source strictement centralisé et/ou si vous avez du mal à introduire le contrôle de source en premier lieu parce que vos collègues ne sont pas intéressés, alors la simplicité et les excellents outils (au moins sous Windows) de SVN brillent.

145voto

Michiel de Mare Points 15888

Avec Git, vous pouvez pratiquement tout faire hors ligne, car tout le monde a son propre référentiel.

Il est très facile de créer des branches et de fusionner entre elles.

Même si vous n'avez pas les droits de commit pour un projet, vous pouvez toujours avoir votre propre dépôt en ligne, et publier des "demandes de push" pour vos correctifs. Tous ceux qui aiment vos correctifs peuvent les intégrer à leur projet, y compris les mainteneurs officiels.

Il est trivial de bifurquer un projet, de le modifier et de continuer à intégrer les corrections de bogues de la branche HEAD.

Git fonctionne pour les développeurs du noyau Linux. Cela signifie qu'il est très rapide (il doit l'être) et qu'il peut être utilisé par des milliers de contributeurs. Git utilise également moins d'espace (jusqu'à 30 fois moins d'espace pour le dépôt Mozilla).

Git est très flexible, très TIMTOWTDI (Il y a plus d'une façon de le faire). Vous pouvez utiliser le flux de travail que vous voulez, et Git le supportera.

Enfin, il y a GitHub un excellent site pour héberger vos dépôts Git.

Inconvénients de Git :

  • il est beaucoup plus difficile à apprendre, car Git comporte plus de concepts et de commandes.
  • les révisions n'ont pas de numéros de version comme dans subversion
  • de nombreuses commandes Git sont cryptiques et les messages d'erreur sont très peu conviviaux.
  • il ne dispose pas d'une bonne interface graphique (comme la grande TortoiseSVN )

110voto

andy Points 4460

D'autres réponses ont fait un bon travail d'explication des fonctionnalités de base de Git (qui sont excellentes). Mais il y a aussi tellement de petit pour que Git se comporte mieux et m'aide à garder ma vie plus saine. Voici quelques-unes de ces petites choses :

  1. Git a une commande 'clean'. SVN a désespérément besoin de cette commande, étant donné la fréquence à laquelle il déverse des fichiers supplémentaires sur votre disque.
  2. Git a la commande 'bisect'. C'est une bonne chose.
  3. SVN crée des répertoires .svn dans chaque dossier (Git crée uniquement des répertoires un .git). Chaque script que vous écrivez, et chaque grep que vous faites, devra être écrit pour ignorer ces répertoires .svn. Vous avez également besoin d'une commande entière ("svn export") juste pour obtenir une copie saine de vos fichiers.
  4. Dans SVN, chaque fichier et dossier peut provenir d'une révision ou d'une branche différente. Au début, cela semble agréable d'avoir cette liberté. Mais ce que cela signifie en réalité, c'est qu'il y a un million de façons différentes pour votre checkout local d'être complètement raté. (par exemple, si "svn switch" échoue à mi-chemin, ou si vous entrez mal une commande). Et le pire, c'est que si vous vous retrouvez dans une situation où certains de vos fichiers proviennent d'un endroit, et d'autres d'un autre, le "svn status" vous dira que tout est normal. Vous devrez faire "svn info" sur chaque fichier/répertoire pour découvrir à quel point les choses sont bizarres. Si "git status" vous dit que les choses sont normales, alors vous pouvez croire que les choses sont vraiment normales.
  5. Vous devez informer SVN chaque fois que vous déplacez ou supprimez quelque chose. Git se débrouillera tout seul.
  6. La sémantique des ignorations est plus simple dans Git. Si vous ignorez un motif (tel que *.pyc), il sera ignoré pour les éléments suivants tous sous-répertoires. (Mais si vous voulez vraiment ignorer quelque chose pour un seul répertoire, vous pouvez le faire). Avec SVN, il semble qu'il n'y ait pas de moyen simple d'ignorer un motif dans tous les sous-répertoires.
  7. Un autre point concernant les fichiers d'ignorance. Git permet d'avoir des paramètres d'ignorance "privés" (en utilisant le fichier .git/info/exclude), qui n'affecteront personne d'autre.

56voto

sebnow Points 950

" Pourquoi Git est meilleur que X "Ce document présente les avantages et les inconvénients de Git par rapport aux autres SCM.

En bref :

  • Pistes Git du contenu plutôt que des fichiers
  • Les branches sont légères et la fusion est facile et je veux dire vraiment facile .
  • Il est distribué, chaque dépôt est en fait une branche. Il est beaucoup plus facile de développer de manière concurrente et collaborative qu'avec Subversion, à mon avis. Cela rend aussi hors ligne développement possible.
  • Il n'impose aucun flux de travail comme vu sur le site web susmentionné Il existe de nombreux flux de travail possibles avec Git. Un flux de travail de type Subversion est facilement imitable.
  • Les dépôts Git sont beaucoup plus une taille de fichier plus petite que les dépôts de Subversion. Il n'y a qu'un seul répertoire ".git", par opposition à des dizaines de dépôts ".svn" (à partir de la version 1.7 de Subversion). utilise désormais un seul répertoire comme Git).
  • Le site mise en scène est géniale, elle vous permet de voir les changements que vous allez commettre, de commettre des changements partiels et de faire diverses autres choses.
  • Mise à l'abri est inestimable lorsque vous faites du développement "chaotique", ou que vous voulez simplement corriger un bogue pendant que vous travaillez encore sur autre chose (sur une branche différente).
  • Vous pouvez réécrire l'histoire qui est idéal pour préparer des ensembles de correctifs et réparer vos erreurs ( avant vous publiez les commits)
  • et un lot plus.

Il y a quelques inconvénients :

  • Il n'y a pas encore beaucoup de bonnes interfaces graphiques pour cela. C'est nouveau et Subversion existe depuis beaucoup plus longtemps, donc c'est naturel car il y a quelques interfaces en développement. Quelques bonnes interfaces sont TortoiseGit et GitHub pour Mac .
  • Les extractions/clones partiels de dépôts ne sont pas possibles pour le moment (j'ai lu que c'était en cours de développement). Cependant, il y a un support pour les sous-modules. Git 1.7+ supporte les "sparse checkouts". .
  • Il pourrait être plus difficile à apprendre, même si je n'ai pas trouvé que c'était le cas (il y a environ un an). Git a récemment amélioré son interface et est assez convivial.

Dans l'utilisation la plus simpliste, Subversion et Git sont à peu près les mêmes. Il n'y a pas beaucoup de différence entre :

svn checkout svn://foo.com/bar bar
cd bar
# edit
svn commit -m "foo"

et

git clone git@github.com:foo/bar.git
cd bar
# edit
git commit -a -m "foo"
git push

Là où Git brille vraiment, c'est lorsqu'il s'agit de travailler avec d'autres personnes.

54voto

ESV Points 4591

Google Tech Talk : Linus Torvalds sur git

http://www.youtube.com/watch?v=4XpnKHJAok8

La page de comparaison du Git Wiki

http://git.or.cz/gitwiki/GitSvnComparsion

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X