Fusion: Hg/Git vs SVN
J'ai souvent lu que Hg (et Git et...) sont de mieux en mieux la fusion de SVN, mais je n'ai jamais vu des exemples pratiques de l'endroit où Hg/Git pouvez fusionner quelque chose où SVN échoue (ou SVN besoins intervention manuelle). Pourriez-vous envoyer un peu de l'étape-par-étape des listes de branche/modifier/commettre/...-les opérations qui montrent où SVN serait un échec alors que Hg/Git heureusement se déplace sur? Pratique, pas très des cas exceptionnels, s'il vous plaît...
Un peu de contexte: nous avons quelques dizaines de développeurs qui travaillent sur des projets d'utilisation de SVN, chaque projet (ou d'un groupe de projets similaires) dans son propre référentiel. Nous savons comment l'appliquer à libération et à la fonctionnalité des branches, afin de ne pas courir dans des problèmes très souvent (c'est à dire, nous avons été là, mais nous avons appris à surmonter Joël problèmes de "un programmeur causant un traumatisme pour l'ensemble de l'équipe" ou "besoin de six développeurs pour deux semaines à réintégrer une branche"). Nous avons de presse-branches, qui sont très stables et seulement utilisé pour appliquer des corrections de bugs. Nous avons des troncs d'arbres qui doivent être suffisamment stables pour être en mesure de créer une libération dans un délai d'une semaine. Et nous avons fonctionnalité-branches que seul les développeurs ou les groupes de développeurs peuvent travailler sur. Oui, ils sont supprimés après la réintégration, afin de ne pas encombrer le référentiel. 😉
Donc je suis encore à essayer de trouver les avantages de Hg/Git sur le SVN. J'aimerais obtenir une certaine expérience pratique, mais il ne sont pas tous les grands projets que nous pourrions passer à Hg/Git encore, donc je suis bloqué, en jouant avec de petits artificielle des projets qui ne contiennent que quelques-uns des fichiers. Et je suis à la recherche de quelques cas où vous pouvez sentir la puissance impressionnante de Hg/Git, depuis ce jour, j'ai souvent lu sur eux, mais a échoué à trouver moi-même.
- Je pense que vous devriez prêter attention aux doublons exacts: stackoverflow.com/questions/43995/... stackoverflow.com/questions/459891/...
- Je l'avais déjà lu le premier, l'autre était nouveau. Mais ils déjà 1 à 2 ans et semblent être la plupart du temps sur les pré-svn-1.5 questions (où svn n'ont pas suivi de fusion encore).
- Juste un commentaire que vous pouvez également forfaitaire Bazar avec git/hg comme un autre DVCS qui va gérer le dessous de problèmes correctement. Et puisque vous avez mentionné en essayant de trouver des avantages: un simple avantage logistique git/hg/bzr est que les branches ne sont pas mondiales comme ils sont avec svn. Vous n'avez pas à voir 67 branches, lorsque seulement un couple s'appliquer à vous. Tout le monde fait son travail en "privé" les branches et ensuite utiliser l'excellente capacité de fusion pour fusionner sans transpiration si la fusion est d'aller travailler dans 99% des cas.
- voyez-vous "privé" branches que l'avantage dans un environnement d'entreprise? je suis inquiet sur les sauvegardes. j'ai souvent des branches qui vivent pendant 1 à 2 mois avant la réintégration..
- Une préoccupation valable. Cependant, ce que vous trouvez dans beaucoup d'environnements d'entreprise de subversion c'est que les gens arrêtent de vérification jusqu'à ce que leur code est parfait, et vous avez la même exposition.
- Je pense que stmax a un point, cependant. Une caractéristique que vous travaillez sur plus de semaine devrait certainement être poussé vers le serveur, même si personne d'autre a besoin de la toucher. Garder que beaucoup de travail exclusivement sur votre poste de travail est mauvaise pratique de n'importe quel système de contrôle de version que vous utilisez.
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas d'utiliser Subversion moi-même, mais à partir de la notes de publication pour la Subversion 1.5: suivi de Fusion (fondateur) qu'il semble y avoir des différences suivantes à partir de combien de suivi de fusion un travail en full-DAG systèmes de contrôle de version comme Git ou Mercurial.
Fusion tronc, la branche est différente de la fusion de la branche du tronc: pour une raison quelconque la fusion de tronc à la branche nécessite
--reintegrate
option poursvn merge
.Distribués des systèmes de contrôle de version comme Git ou Mercurial il n'y a pas de technique différence entre le tronc et les branches: toutes les branches sont créés égaux (il y a peut être sociale différence, tout de même). La fusion dans les deux sens est fait de la même façon.
Vous devez présenter une nouvelle
-g
(--use-merge-history
) option poursvn log
etsvn blame
de prendre le suivi de fusion en compte.Dans Git et Mercurial suivi de fusion est automatiquement pris en compte lors de l'affichage de l'historique (log) et de blâme. Dans Git, vous pouvez demander à suivre premier parent seul avec
--first-parent
(je suppose option similaire existe aussi pour Mercurial) à "jeter" fusionner les informations de suivi dansgit log
.De ce que je comprends
svn:mergeinfo
propriété de magasins par-chemin d'accès de l'information au sujet des conflits (la Subversion de l'ensemble de modifications à base de), tandis que dans Git et Mercurial, il est tout simplement commettre des objets qui peuvent avoir plus d'un parent."Problèmes connus" paragraphe pour le suivi de fusion dans la Subversion suggère que l'exposition répétée /cyclique /réfléchissant de fusion peut ne pas fonctionner correctement. Cela signifie qu'avec la suite des histoires de deuxième fusion ne pourrait pas faire la bonne chose ('A' peut être tronc ou de la branche, et " B " peuvent être de la branche ou le tronc, respectivement):
Dans le cas ci-dessus ASCII-art est cassé: la division " B "est créé (fourche) à partir de la succursale" A "à la révision de "x", puis, plus tard, succursale " A "est fusionné à la révision de" y "dans la branche" B "fusion et publipostage "M1", et, enfin, succursale " B "est fusionné dans la branche" Une "fusion et publipostage "M2".
Dans le cas ci-dessus ASCII-art est cassé: la division " B "est créé (fourche) à partir de la succursale" A "à la révision de "x", il est fusionné en direction de 'A' à 'y' comme 'M1', et plus tard fusionné à nouveau en direction de " A "comme " M2".
Subversion peut pas prendre en charge des cas de criss-cross de fusion.
Git gère cette situation très bien dans la pratique à l'aide de "récursive" fusion de la stratégie. Je ne suis pas sûr de Mercurial.
Dans "Problèmes Connus" il s'agit d'un avertissement que le suivi de fusion mlgh pas le travail avec le fichier renomme, par exemple, quand d'un côté renomme le fichier (et peut-être la modifier), et le deuxième côté modifie le fichier sans le renommer (en vertu de l'ancien nom).
Les deux Git et Mercurial gérer de tels cas, l'amende juste dans la pratique: à l'aide de Git renommer détection, Mercurial utilisant renommer le suivi.
HTH
<pre>...</pre>
bloc n'est pas en retrait comme il se doit...--reintegrate
est obsolète.Moi aussi, j'ai été à la recherche d'un cas où, disons, la Subversion ne parvient pas à fusionner une branche et de Mercurial (et Git, Bazaar, ...) fait la bonne chose.
Le SVN Livre décrit comment fichiers renommés sont fusionnées de manière incorrecte. Cela s'applique à la Subversion 1.5, 1.6, 1.7, et 1.8! J'ai essayé de recréer la situation ci-dessous:
Selon le livre, la fusion devrait se terminer proprement, mais avec de fausses données dans le fichier renommé depuis la mise à jour sur
trunk
est oublié. Au lieu de cela, je reçois un arbre de conflit (c'est avec Subversion 1.6.17, la nouvelle version de Debian au moment de la rédaction):Il ne devrait pas y avoir de conflit — la mise à jour devraient être intégrés dans le nouveau nom du fichier. Alors que la Subversion échoue, Mercurial gère correctement:
Avant la fusion, le dépôt ressemble à ceci (à partir de
hg glog
):La sortie de la fusion est:
En d'autres termes: Mercurial a eu le changement de la révision 1 et fusionné avec ce nouveau nom de fichier à partir de la révision 2 (
hello.en.txt
). La manipulation de ce cas est bien sûr essentiel pour le soutien de refactoring et de refactoring est exactement le genre de chose que vous voulez faire sur une branche.Sans parler des avantages habituels (hors ligne s'engage, publication,...), voici une "fusion" exemple que j'aime bien:
Le scénario principal je continue à voir est une branche sur laquelle ... deux sans rapport avec les tâches sont effectivement développé
(il a commencé à partir d'une fonction, mais il conduire à l'élaboration de cette autre entité.
Ou il a commencé à partir d'un patch, mais il conduire à l'élaboration d'une autre fonction).
Comment vous ne fusionner que l'un des deux sur la branche principale?
Ou Comment isoler les deux caractéristiques dans leurs propres branches?
Vous pouvez essayer de créer une sorte de patchs, le problème avec cela est que vous n'êtes pas sûr des les dépendances fonctionnelles qui pouvait exister entre:
Git (et Mercurial trop je suppose) proposer le rebase --sur option à rebase (réinitialisation de la racine de la branche) de la partie de la branche:
De Jefromi post
vous pouvez démêler cette situation où vous avez des correctifs pour la v2 ainsi qu'une nouvelle wss fonction:
vous permettant de:
L'autre caractéristique que j'aime (qui influence fusionne) est la capacité à squash s'engage (dans une branche pas encore poussé à l'autre pensions) dans le but de présenter:
Qui assurent des fusions, qui sont beaucoup plus facile, avec moins de conflits.
Nous avons récemment de SVN à GIT, et face à cette incertitude. Il y avait beaucoup de preuves anecdotiques que GIT a été mieux, mais il était difficile de trouver des exemples.
Je peux vous dire cependant, que GIT est BEAUCOUP MIEUX à la fusion de SVN. C'est évidemment anecdotique, mais il y a un tableau à suivre.
Voici certaines des choses que nous avons trouvé:
Quand nous étions évaluation de GIT, nous avons couru les tests suivants. Ceux-ci montrent GIT comme le gagnant quand il s'agit de la fusion, mais pas tant que ça. Dans la pratique, la différence est beaucoup plus grande, mais je suppose que nous n'avons pas réussi à reproduire les situations que SVN gère mal.
D'autres ont couvert les aspects plus théoriques de cette. Peut-être que je peux apporter un plus point de vue pratique.
Je suis actuellement en train de travailler pour une entreprise qui utilise SVN dans une "branche" du modèle de développement. Qui est:
En général, il fonctionne. SVN peut être utilisé pour un flux comme ça, mais il n'est pas parfait. Il y a certains aspects de SVN qui obtenir de la manière et la forme du comportement humain. Ce qui lui donne certains aspects négatifs.
^/trunk
. Ce portées fusionner les informations des enregistrements de l'ensemble de l'arbre, et il se brise finalement le suivi de fusion. De faux conflits commencent à apparaître, et la confusion règne.svn merge
fait ce que vous voulez. Fusionner vos modifications exige (dit-on)--reintegrate
sur la commande de fusion. Je n'ai jamais vraiment compris ce commutateur, mais cela signifie que la direction générale ne peut pas être fusionné dans le tronc de nouveau. Cela signifie que c'est une branche morte et vous devez en créer un nouveau pour continuer le travail. (Voir la note)Ce qui tend à arriver, c'est qu'un ingénieur crée une succursale de la journée 1. Il commence son travail et oublie à ce sujet. Quelques temps plus tard, un patron arrive et demande s'il peut libérer de son travail pour le tronc. L'ingénieur a été redoutant ce jour, car la réintégration signifie:
...et parce que l'ingénieur n'a cette aussi peu qu'ils le peuvent, ils ne peuvent pas se rappeler le "incantation magique" à chaque étape. Mal commutateurs et les Url de se produire, et tout à coup ils sont dans un désordre et ils vont chercher les "experts".
Finalement, tout s'installe, et les gens apprennent à faire avec les défauts, mais à chaque nouveau départ passe par les mêmes problèmes. L'éventuelle réalité (contrairement à ce que j'ai énoncé au début) est:
...mais...
Heureusement, l'équipe est assez petit pour s'en sortir, mais il ne serait pas à l'échelle. La chose est, aucun d'eux n'est un problème avec CVC, mais plus que parce que les fusions ne sont pas aussi importants que dans les DVCS ils ne sont pas aussi lisse. Que "la fusion de friction" les causes des comportements qui signifie qu'une "Branche" modèle commence à s'effriter. Bon fusionne besoin d'être une caractéristique de tous les VCS, et pas seulement DVCS.
Selon cette il y a maintenant un
--record-only
interrupteur qui pourrait être utilisé pour résoudre les--reintegrate
problème, et apparemment v1.8 choisit quand à faire un réintégrer automatiquement, et il ne cause pas de la branche à mort par la suiteAvant subversion 1.5 (si je ne me trompe pas), subversion a eu un important dissadvantage en ce qu'elle ne se souviendrait pas de fusion de l'histoire.
Regardons le cas exposé par VonC:
Avis des révisions A et B. vous Dire fusionné les changements de révision sur la "wss" branche de la "v2" uniquement " direction de la révision B (pour quelque raison que ce soit), mais a continué à l'aide de deux branches. Si vous avez essayé de fusionner les deux branches, en utilisant à nouveau mercurial, ce ne serait que la fusion des modifications après les révisions et B. Avec subversion, vous auriez à la fusion de tout, comme si vous ne l'avez pas une fusion avant.
C'est un exemple tiré de ma propre expérience, où la fusion de B à A pris plusieurs heures en raison du volume de code: cela aurait été une vraie douleur pour aller à travers nouveau, ce qui aurait été le cas avec la subversion de pré-1.5.
Un autre, il est probablement plus pertinent de différence dans le comportement de fusion de Hginit: Subversion de Ré-éducation:
En bref, de Mercurial façon d'analyser les différences est (était?) supérieure à la subversion de l'.