web-dev-qa-db-fra.com

Git rebase une branche au dessus d'une autre

Dans mon dépôt Git, j'ai une branche Master. Un des développeurs distants a créé une branche Branch1 et a eu un tas de commits dessus. Je suis parti de Branch1, créant une nouvelle branche appelée Branch2 (git checkout -b Branch2 Branch1) tel que Branch2 _ tête était sur le dernier commit ajouté à Branch1:(Ressemble à ça)

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

Branch1 a eu plusieurs changements. L'autre dev a écrasé ses commits, puis ajouté quelques autres. Pendant ce temps, ive a eu beaucoup de changements dans ma branche mais je n'ai encore rien fait. La structure actuelle ressemble à ceci:

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

Maintenant, je veux avoir à rebaser mes modifications sur Branch1. Je suis extrêmement confus sur la façon de s'y prendre. Je sais que la 1ère étape sera de valider mes modifications en utilisant git add . et git commit -m "message". Mais dois-je alors pousser? en utilisant git Push Origin Branch2? ou git Push Origin Branch2 Branch1? De l'aide est grandement nécessaire et grandement appréciée. Même si je peux créer une copie de sauvegarde de ma branche, ce sera formidable au cas où je ferais n'importe quoi.

39
newkid101

Commencez par sauvegarder votre Branch2 Actuel:

# from Branch2
git checkout -b Branch2_backup

Puis rebassez Branch2 Sur Branch1:

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

Après la refonte 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 chaque commit dans le rebasement Branch2after commit 4 est en réalité une réécriture.

Gardez à l'esprit que vous avez maintenant réécrit l'historique de Branch2 Et que si la branche est déjà publiée, vous devrez forcer Push it to the remote via

git Push --force Origin Branch2

Le fait de forcer peut causer des problèmes à quiconque utilise Branch2, Vous devez donc faire attention lorsque vous le faites.

41
Tim Biegeleisen

git rebase branch1 branch2 va rebaser la branche branch2 sur branch1. Sur le plan opérationnel, cela signifie tous les commits qui ne sont contenus que dans branch2 (et pas dans branch1) sera rejoué sur branch1, en déplaçant le branch2 pointeur avec eux. Voir git rebase --help pour plus d'informations, y compris les diagrammes de cette opération.

L'opération peut générer des conflits que vous devrez ensuite résoudre manuellement. Modifiez les fichiers concernés en fusionnant le contenu et en supprimant les éléments défaillants. Ensuite, marquez les fichiers comme étant fusionnés avec git add <file> puis continuez la rebase en utilisant git rebase --continue. Répétez jusqu'à ce que c'est fait.

Une fois cela fait, vous n’avez plus rien à faire. Vous n'êtes pas obligé de pousser. Toutefois, si vous souhaitez mettre en miroir vos nouvelles modifications dans un autre référentiel (par exemple, pour les partager avec d'autres ou pour avoir ces modifications dans un autre référentiel du vôtre), effectuez un git Push.

15
dkasak

Je veux modifier mes modifications (à partir du local branch2) En plus de 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 distante, telle que Origin, préfixez le nom de la branche avec Origin/.

Dépannage

  • Si vous êtes bloqué au milieu de rebase et que vous souhaitez recommencer, lancez:

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

    git checkout branch2 -f # and start again.
    
  • Si vous obtenez des conflits, vous devez les corriger , utilisez un point de rebasement différent.

  • Si vous souhaitez effectuer un rebase manuellement, étape par étape, utilisez la sélection en cherry. Par exemple.

    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 base affiche trop de validations sur la liste interactive après avoir exécuté git rebase branch1 -i, Vous pouvez commencer votre répétition en fonction du commit spécifique juste avant vos modifications, par exemple. git rebase pr3v1ios.

3
kenorb