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
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.
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
.
Je veux rebaser mes modifications (à partir de
branch2
local) au-dessus debranch1
.
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 exemplegit rebase pr3v1ios
.
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