2011-06-22 5 views
2

Supposons que je la situation suivante:git-rebase: Converge deux branches divergeant/dépôts

Il y a un principal référentiel de l'utilisateur Foo. La barre d'utilisateur forks ce référentiel, donc les deux référentiels sont synchronisés. Maintenant, l'utilisateur Bar implémente une fonctionnalité et crée une branche locale appelée "barbranche". Au moment où l'utilisateur Bar a fini d'implémenter une fonctionnalité, Foo s'est engagé et a poussé quelque chose dans le référentiel principal. Donc, fondamentalement, la situation ressemble à ceci:

A---B---C---D main repository 
     \ 
      E  forked repository (where C=E) 
      \ 
      F barbranch on forked repository 

Maintenant, comment peut-on revenir à la normale dans le repo de l'utilisateur Foo?

Naïvement je dirais:

# switch to the local master and merge barbranch into it 
git checkout master 
git pull 
git pull upstream 
git push 
git merge barbranch 
# merge conflicts occur 
vi somefile 
git commit -a 
git rebase origin master 
# this conflict occurs again 
vi somefile 
git commit -a 
git status # says I'm on (no branch) ?! 
git push 
g it checkout master 
# conflict occurs again! 
vi somefile 
git commit -a 
git push 
# send merge request to user Foo 

Enfin cela me donne trois engage laid au lieu d'un. J'ai trouvé git rebase --onto .... Bien que je ne peux pas comprendre ce que le commandement exact serait et tout ce processus ressemblerait à la fin.

Répondre

2

Cela dépend de l'arbre que vous voulez obtenir.

Si vous voulez un arbre qui représente la véritable histoire de travail, vous ne devriez pas utiliser « rebasage » mais seulement « fusion »

# on bar repo 
git fetch upstream 
git checkout master 
git merge upstream/master (fast-forward) 
git merge barbranch 
# resolve conflicts (adding resolved files) 
git commit 
git push upstream master 

Si vous voulez « linéariser » le travail avec rebasage, voici ce que vous devrait faire:

# on bar repo 
git fetch upstream 
git checkout master 
git merge upstream/master (fast-forward) 
git checkout barbranch 
git rebase master 
# resolve conflicts + commits (each commit will be processed separately: so you may need to do that several times if various commits are in conflict with the upstream) 
git checkout master 
git merge barbranch **(fast-forward after the rebase)** 
git push upstream master 
+0

Merci, oui je veux la version "linéarisé". Juste pour clarifier: Est-ce que cela importe sur quelle branche je fais «git fetch upstream»? Chaque étape de "résoudre les conflits + commits" est à la fin 'vi quelquechose; git commit -a', n'est-ce pas? – user694971

+1

Vous pouvez aller chercher de partout. Résoudre les conflits = ("vi" + "git add resolved_file") pour chaque fichier de conflit + un "commit git" final. De cette façon, c'est mieux quand plusieurs fichiers sont en conflit: vous pouvez savoir à chaque fois quels fichiers de conflits ne sont pas encore résolus avec "git status". –

+0

C'est vraiment bizarre, je reçois des messages comme [this] (http://pastebin.com/NFirzz6g). Bien que cette branche ait été créée avant que le patch de la question ait été accepté ... – user694971

2

Je pense que le scénario suivant devrait convenir à votre situation.

  • Commander maître
  • Tirez la branche fourchue dans votre maître local
  • corriger manuellement les conflits
  • Valider les modifications sur la résolution des conflits
  • pousser à maîtriser

Ce sera en fait aboutir à 3 commits dans votre maître (vous aurez les commits E & F et votre commi t).

Questions connexes