2010-08-02 7 views
1

On dirait que dans SVN, quand vous fusionnez, aucune révision ne sera effectuée par vous. Toutes vos "validations" ne devraient avoir que du code qui est modifié par vous.Est-il vrai dans Mercurial (hg), le même que Git, qu'une révision que vous avez commise ne peut avoir que du code que vous n'avez pas modifié? (une fusion)

Mais dans Mercurial, ce n'est pas le cas. Vos commits de "fusion" sont commis par vous, mais ils contiennent habituellement des modifications qui sont faites par d'autres personnes. Et si cette validation a déclenché une erreur dans le test automatisé, alors ce peut être la "fusion" qui a cassé la base de code, signifiant que les autres changements n'ont pas fonctionné avec le vôtre ou vice versa? (mais les autres changements peuvent ne pas avoir révélé l'erreur parce que (1) il n'est pas allé aussi loin dans le test (2) les tests sont groupés ensemble - et si le test 102 a pris 1 heure pour fonctionner et il y a 3 poussées dans cette heure, seule la dernière version poussée est testée)

Est-ce le même comportement que Git?

Alors vous devez vraiment regarder le test lui-même pour voir ce qui le cause et le réparer ... mais qui devrait le regarder - vous ou votre membre de l'équipe?

première rencontre de ce comportement se sent un peu bizarre ...

Répondre

3

La fusion sera commise par celui qui le fait. Mais vous pouvez bisect l'arbre, puis blame la personne qui a causé le problème. Aussi, si vous avez des idées d'un couple de personnes responsables, vous devriez leur dire de le regarder. Si vous avez bien écrit vos tests, ils devraient vous donner une idée de ce qui ne va pas. Si leurs caractéristiques ne peuvent pas être résolues, vous devrez être diplomate et prendre des décisions.

0

Je ne comprends pas très bien ce que vous demandez. Lorsque vous joignez deux lignes de développement (fusion), vous créez un commit de fusion, c'est-à-dire une révision représentant cet acte de jonction de deux lignes d'historique. Dans Git et Mercurial, un tel engagement se souvient des deux parents; dans Subversion, une telle révision se souvient des deux révisions pour tous les fichiers (si je comprends bien).

Dans la plupart des cas, le commit de fusion serait créé automatiquement; dans Git (et je pense aussi dans Mercurial) en utilisant la fusion à trois voies, où le troisième point (à côté des conseils des deux lignes fusionnées de développement/branches) est un ancêtre commun. Subversion seulement récemment (depuis la version 1.5, si je me souviens bien) stocker les informations nécessaires pour calculer la base de fusion (sans utiliser d'outils tiers tels que SVK ou svnmerge). Notez que pour autant que je sache, Subversion fusionne les fichiers, alors que Git et Mercurial fusionnent les révisions dans leur ensemble.

Parfois, la fusion automatique échoue et vous devez résoudre manuellement les conflits, puis valider la fin d'une fusion. C'est quelque chose qui pourrait arriver dans n'importe quel système de contrôle de version.

Indépendamment du fait que la fusion automatique ait réussi ou échoué, l'acte de fusionner lui-même (le commit de fusion dans Git et Mercurial) pourrait introduire des bogues. Prenons par exemple la situation où un côté modifie la convention d'appel pour une fonction et l'autre côté ajoute un autre site d'appel avec l'ancienne API. La fusion automatique peut réussir, mais la fusion introduira une erreur, même si les deux lignes de développement sont exemptes d'erreur.

Néanmoins git bisect peut trouver que c'était commit de fusion (acte de fusion) qui a introduit le bogue.

+0

peut-être que vous n'avez pas utilisé SVN ou CVS auparavant?Je pense que dans ce système, une fusion n'est pas un commit séparé. –

+0

Dans ces systèmes de contrôle de version (CVS et Subversion antérieurs à la version 1.5), fusionner était une révision séparée, mais ne se souvenait pas qu'il s'agissait d'une fusion, c'est-à-dire qu'elle venait de fusionner deux lignes de développement (par exemple 'cvs update -j ... -j ... 'crée un commit, IIRC). –