Utilisation de git-svn: Pull, Merge ou Rebase?

J'ai combattu la courbe d'apprentissage git/git-svn et hier soir, dans le cadre de cette courbe d'apprentissage, j'ai fait quelque chose de très, très mauvais. Je l'ai depuis corrigé, mais j'espère comprendre l'erreur à ma façon.

J'ai un référentiel svn à partir duquel j'ai cloné le tronc et les branches (balises que j'ai ignorées puisque nous ne travaillons pas sur celles-ci). En utilisant git, j'ai créé des branches locales pour chacune des branches avec lesquelles je dois actuellement travailler:

$ git checkout -b trunk svn/trunk
$ git checkout -b feature1 svn/branches/development/feature1
$ git checkout -b maint svn/branches/maintenance/previous-version

J'ai fait feature1 ma branche active et a fait quelques changements avant de se faire retirer pendant quelques jours. Je cam retour à hier voulait intégrer les changements qui avaient été apportées au tronc de sorte que je travaillais avec le dernier et le plus grand. Ce que j'ai fait était une mise à jour complète de tous les brances en premier, via git svn rebase (personne d'autre n'avait travaillé sur la branche feature1). Avec tout à jour de mon référentiel svn, j'ai essayé de rebaser.

Avec feature1 comme branche active, j'ai fait un "tronc de rebase git" en pensant que Je tirerais des changements du tronc dans la branche feature1. Il s'avère que j'avais très, très tort. Après avoir fusionné tous les conflits, j'ai fait un git svn dcommit et j'ai trouvé que mes modifications avaient été appliquées au tronc.

Ma première question est simplement où était l'erreur fondamentale dans mon processus de pensée? Ma seconde est, après beaucoup de lecture et de Googling, je vois des gens épousant des tractions, des fusions et des rebases. Compte tenu du fait que je veux fusionner les modifications appliquées dans un local branche vers une autre branche locale, qu'est-ce que devrais-je faire? Quelle est la meilleure pratique pour ce scénario?

Merci pour votre aide.

24
demandé sur Rob Wilkerson 2009-02-24 19:03:50

2 réponses

Le problème que vous avez rencontré est que la syntaxe de ligne de commande pour rebase ne correspond pas à vos attentes (très raisonnables, IMO).

$ git checkout feature1
$ git rebase trunk

Cette séquence Ajoute les commits feature1 non partagés sur la tête du tronc, et vous vous attendiez à ce qu'il place les nouveaux commits du tronc sur la tête de feature1. La syntaxe a du sens lorsque vous savez comment le modèle de données de Git est implémenté(ce qui explique sans aucun doute pourquoi il est tel qu'il est). Mais pour moi c'est le contraire de ce que j'attends, fonctionnellement. Il est préférable de l'apprendre comme une construction arbitraire et de ne pas essayer d'avoir des attentes.

Vous avez raison de comprendre comment interagir avec le dépôt SVN en utilisant git-svn. Ignorez donc ce que vous avez trouvé dans googler sur push and pull et merge - il y a beaucoup de discussions presque justes par des gens qui agissent comme si push and pull et merge étaient les mêmes dans git et svn. Presque juste est toujours faux.

16
répondu Paul 2009-02-24 19:00:51

Vous devez utiliser git svn clone-s {[2] } pour cloner l'arbre svn complet, y compris toutes les branches. À partir de là, utiliser git svn rebase et git svn dcommit en maître à traiter avec svn, et vous pouvez créer régulièrement des branches git pour votre usage privé.

-3
répondu Marko 2009-02-24 16:06:57