84 votes

Git rebase une branche au dessus d'une autre

Dans mon repo git, j'ai un Master de la branche. Un de la télécommande devs créé une succursale Branch1 et a un ensemble de commits sur elle. Je ramifié Branch1, la création d'une nouvelle branche appelée Branch2 (git checkout -b Branch2 Branch1) tels que Branch2 tête était sur le dernier commit ajouté Branch1:(Ressemble à ça)

Master---
         \
          Branch1--commit1--commit2
                                   \
                                    Branch2 (my local branch) 

Branch1 a eu un certain nombre de changements. Les autres dev écrasé sa s'engage puis ajouté un peu plus de commits. Pendant ce temps, j'ai eu un tas de changements dans ma branche mais n'engage rien encore. Structure actuelle ressemble à ceci:

  Master---
             \
             Branch1--squashed commit1,2--commit3--commit4
                                       \
                                        Branch2 (my local branch)

Maintenant, je veux avoir de rebase de mes modifications sur le dessus de l' Branch1. Je suis extrêmement confus sur la façon d'aller à ce sujet. Je sais que la 1ère étape sera de commettre mes changements à l'aide de git add . et git commit -m "message". Mais je ne puis pousser? à l'aide de git push origin Branch2 ? ou git push origin Branch2 Branch1 ? L'aide est d'autant plus nécessaire et beaucoup apprécié, même si je peux certains comment créer une sauvegarde de ma branche, il sera grand dans le cas où je vis quelque chose

109voto

Tim Biegeleisen Points 53335

D'abord une sauvegarde de votre actuelle Branch2:

# from Branch2
git checkout -b Branch2_backup

Puis rebase Branch2 sur Branch1:

# from Branch2
git fetch origin           # update all tracking branches, including Branch1
git rebase origin/Branch1  # rebase on latest Branch1

Après le rebase de votre structure de branche devrait ressembler à ceci:

master --
         \
          1 -- 2 -- 3 -- 4 -- Branch2'

Dans le diagramme ci-dessus, l'apostrophe sur Branch2 indique que tous s'engager dans la relocalisée Branch2 après commit 4 est en fait une réécriture.

Gardez à l'esprit que vous avez maintenant de réécrire l'histoire de l' Branch2 , et si la branche est déjà publié, vous aurez à force de le pousser à distance via

git push --force origin Branch2

Force de poussée peut causer des problèmes pour quelqu'un d'autre à l'aide de Branch2 donc vous devez être prudent lorsque vous faites cela.

38voto

dkasak Points 1923

git rebase branch1 branch2 sera rebase les changements exclusivement en vertu de l' branch2 sur branch1.

L'opération peut produire des conflits, alors vous aurez à résoudre manuellement. Modifier les fichiers concernés, la fusion de contenu et d'enlever tous échoué les beaux mecs. Ensuite, cochez les fichiers que fusionnés à l'aide de git add <file> , puis de continuer le rebase l'aide d' git rebase --continue. Répéter jusqu'à ce qu'il se fait.

Une fois cela fait, vous n'avez rien d'autre à faire. Vous n'avez pas à pousser. Cependant, si vous souhaitez en miroir de vos nouvelles modifications à un autre référentiel (par exemple, pour le partager avec les autres ou d'avoir ces changements dans un autre référentiel de la vôtre), faire une dernière git push.

5voto

kenorb Points 2464

Je veux rebase mes modifications (à partir de locaux branch2) sur le dessus de l' branch1.

git checkout branch2   # Go to your local branch. Use -f to force the checkout.
git reset HEAD --hard  # Drop all non-committed changes.
git rebase branch1     # Rebase on top of branch1. Use -i for an interactive list.

Remarque: Si une branche est sur la télécommande comme origin, préfixe le nom de la branche avec origin/.

Dépannage

  • Si vous êtes bloqué dans le milieu de l' rebase et que vous souhaitez recommencer, exécutez:

    rm -fr .git/rebase-merge # Abort a rebase-merge mode.
    git reset HEAD --hard    # Reset everything to the current HEAD.
    
  • Si vous êtes sur le détaché de la branche (exécuter: git branch et cherchez le symbole d'étoile), exécutez:

    git checkout branch2 -f # and start again.
    
  • Si vous obtenez des conflits, vous devez les fixer, utiliser les différents rebasage point.

  • Si vous souhaitez faire cela manuellement, étape par étape, l'utilisation de l'écrémage. E. g.

    git reflog              # Note hashes of for your commits.
    git checkout master     # Go to your base branch.
    git cherry-pick C0MM1T1 # Cherry pick first commit based on its hash.
    # Go to the next one or solve the conflicts.
    git cherry-pick C0MM1T2 # Cherry pick another commit and so on.
    
  • Si votre rebase montrant trop s'engage sur la liste interactive après l'exécution de l' git rebase branch1 -i, vous pouvez commencer votre rebase spécifique commettre juste avant vos modifications, par exemple, git rebase pr3v1ios.

3voto

Tiba Points 104

Tout d'abord, vous devez vous assurer que votre référence à Branch1 est à jour (surtout que l'historique a été modifié).

Si vous aimez travailler avec des copies locales, vous pouvez faire quelque chose comme ceci:

 git push origin Branch2 # this ensures you have at least one copy in your remote
git fetch origin
git checkout Branch1
git reset --hard origin/Branch1
git checkout Branch2
git rebase Branch1 # solve conflicts ... and check that everything is ok
git push -f origin Branch2
 

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