Git rebase une branche sur l'autre branche

Dans mon repo git, j'ai une branche Master. Un des développeurs distants a créé une branche Branch1 et avait un tas de commits dessus. Je ramifiée à partir de Branch1, la création d'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 un certain nombre de changements. L'autre dev a écrasé ses commits, puis a ajouté quelques commits supplémentaires. Pendant ce temps, j'ai eu un tas de changements dans ma branche mais je n'ai encore rien commis. Actuel la structure ressemble à ceci:

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

Maintenant, je veux devoir rebaser mes modifications au-dessus de 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 je ne puis pousser? utilisation de git push origin Branch2 ? ou git push origin Branch2 Branch1 ? L'aide est très nécessaire et grandement appréciée, aussi si je peux créer une sauvegarde de ma branche, ce sera génial au cas où je bousillerais quelque chose

28
demandé sur newkid101 2016-10-13 02:12:07

4 réponses

Sauvegardez D'abord votre Branch2 actuel:

# 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, 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 commettre 4 est en fait une réécriture.

Gardez à l'esprit que vous avez maintenant réécrit l'historique de Branch2 et si la branche est déjà publiée, vous devrez la pousser à la télécommande via

git push --force origin Branch2

La poussée de Force peut causer des problèmes à quiconque utilise Branch2, vous devez donc faire attention lorsque vous faites cela.

30
répondu Tim Biegeleisen 2016-10-12 23:45:55

git rebase branch1 branch2 va rebaser les modifications exclusivement sous branch2 sur branch1.

L'opération peut produire des conflits que vous devrez ensuite résoudre manuellement. Modifiez les fichiers affectés, fusionnez le contenu et supprimez tous les morceaux qui ont échoué. Ensuite, marquez les fichiers comme fusionnés en utilisant git add <file>, puis continuez le rebase en utilisant git rebase --continue. Répéter jusqu'à ce qu'il se fait.

Une fois fait, vous n'avez rien d'autre à faire. Vous n'avez pas à pousser. Cependant si vous souhaitez refléter vos nouvelles modifications à d'autres référentiel (par exemple, pour le partager avec d'autres ou pour avoir ces modifications dans un autre référentiel de la vôtre), faites un final git push.

13
répondu dkasak 2017-05-06 20:35:03

Je veux rebaser mes modifications (à partir de branch2 local) au-dessus 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 sur la télécommande comme origin, préfixe le nom de la branche avec origin/.

Dépannage

  • Si vous êtes coincé au milieu de rebase et que vous voulez 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 la branche détachée (exécutez: git branch et recherchez le symbole d'étoile), exécutez:

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

  • Si vous souhaitez effectuer un rebase manuellement étape par étape, Utilisez la cueillette des cerises. 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 rebase montrant trop s'engage sur la liste interactive après l'exécution de git rebase branch1 -i, vous pouvez commencer votre rebase spécifique commettre juste avant vos modifications, par exemple git rebase pr3v1ios.

1
répondu kenorb 2018-01-19 13:54:38

Tout d'abord, vous devez vous assurer que votre référence à Branch1 est à jour (spécialement puisque son 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
-1
répondu Tiba 2016-10-12 23:27:40