350 votes

Changer la base de la branche

J'ai un arbre comme celui-ci :

(commit 1) - master
                \-- (commit 2) - (commit 3) - demo
                                                \-- (commit 4) - (commit 5) - PRO

et je dois déplacer la branche PRO vers master

(commit 1) - master
                |-- (commit 2) - (commit 3) - demo
                \-- (commit 4) - (commit 5) - PRO

J'ai essayé un git rebase master depuis la branche PRO, mais rien ne se passe.

Pour clarifier : j'étais en train de travailler sur master et ensuite j'ai dû faire une démo produit (git checkout -b demo et quelques commits). Puis, par erreur, j'ai créé une autre branche à partir de demo (git checkout -b PRO et quelques commits) et maintenant je dois déplacer la branche PRO vers master en laissant demo intacte. À la fin, à la fois demo et PRO seront reliées à master.

668voto

loganfsmyth Points 25483

En supposant que newBase soit la branche sur laquelle vous souhaitez déplacer vos commits, que oldBase soit l'ancienne base de votre branche, vous pouvez utiliser --onto pour cela :

git rebase --onto newBase oldBase feature/branch

Dans votre cas :

git checkout PRO # Juste pour être clair sur la branche sur laquelle se trouver.
git rebase --onto master demo PRO

Essentiellement, vous prenez tous les commits qui suivent demo jusqu'à PRO inclus, et les rebaser sur le commit master.

66voto

Akshayraj Kore Points 1306

Je vais essayer d'être aussi générique que possible. Tout d'abord, assurez-vous d'être sur la branche désirée :

git checkout current-branch

Ensuite, utilisez la commande suivante (où new-base-branch est la branche que vous souhaitez être votre nouvelle base, et current-base-branch est la branche qui est actuellement votre base.)

git rebase --onto new-base-branch current-base-branch

Si vous n'avez pas de conflits, c'est parfait - vous avez terminé. Si vous en avez (dans la plupart des cas), veuillez continuer à lire.

Des conflits peuvent survenir, et vous devrez les résoudre manuellement. Git essaie maintenant de faire une "fusion à trois voies" entre votre current-branch, current-base-branch et new-base-branch. En gros, voici comment git fonctionnera en interne :

  1. Git va d'abord rebaser le current-base-branch sur le dessus du new-base-branch. Il peut y avoir des conflits ; que vous devrez résoudre manuellement. Une fois cela fait, vous faites habituellement git add . et git rebase --continue. Cela créera un nouveau commit temporaire temp-commit-hash pour cela.

  2. Après cela, Git va maintenant rebaser votre current-branch sur le dessus de temp-commit-hash. Il peut y avoir d'autres conflits et encore une fois vous devrez les résoudre manuellement. Une fois fait, vous continuez à nouveau avec git add . et git rebase --continue, après quoi vous avez réussi à rebaser votre current-branch sur le dessus du new-base-branch.


Remarque : Si vous commencez à vous embrouiller, alors vous pouvez faire git rebase --abort à tout moment pendant le processus de rebase et revenir au point de départ.

44voto

Sajib Khan Points 11151

Passer à la branche PRO, Copiez les hachages de commit les plus anciens (commit4) et les plus récents (commit5) de cette branche et collez-les ailleurs :

$ git checkout PRO
$ git log            # voir l'historique des commits
# copiez les hachages de commit les plus anciens et les plus récents

Supprimez la branche PRO (gardez une sauvegarde par sécurité). Créez et passez à une nouvelle branche PRO à partir de master :

$ git branch PRO.bac    # créez une nouvelle branche PRO.bac = PRO en sauvegarde

$ git checkout master
$ git branch -D PRO     # supprimez la branche locale PRO
$ git checkout -b PRO   # créez et passez à une nouvelle branche 'PRO' à partir de 'master'

Prenez (cherry-pick) la plage de commits de la précédente branche PRO dans la nouvelle branche PRO :

$ git cherry-pick commit4^..commit5   # sélectionnez la plage de commits
# notez le '^' après commit4

Maintenant, si tout va bien, effectuez un push forcé (-f) vers la branche PRO distante et supprimez la branche locale PRO.bac :

$ git log                  # vérifiez l'historique des commits

$ git push -f origin HEAD  # remplacez la branche PRO distante par l'historique de la branche PRO locale
# git branch -D PRO.bac    # supprimez la branche locale PRO.bac

5voto

madjase Points 39

J'ai adopté une approche légèrement différente en utilisant la réinitialisation et les stashs qui évite de supprimer et recréer des branches ainsi que d'éliminer le besoin de changer de branches :

$ git checkout PRO
$ git reset commit4 # Cela mettra la HEAD de PRO sur le commit 4, et laissera les fichiers modifiés du commit 5 dans votre index de travail
$ git stash save -m "Message de commit"
$ git reset commit3
$ git stash save -m "Message de commit"
$ git reset master --hard
$ git stash pop
$ git stash pop
$ git push --force # forcer s'il a déjà été poussé en ligne de commande

En réinitialisant la branche commit par commit, vous rembobinez essentiellement l'historique de cette branche un commit à la fois.

0voto

nirmal Points 1130

Je sais que cette question est assez ancienne, mais je la partage au cas où cela pourrait aider quelqu'un.

J'étais dans la même situation où j'ai créé une PR à partir d'une branche de base différente et où le changement de base et le rebasage montraient plus de 200 conflits de fichiers.

Même en le résolvant, cela montrait des commits plus anciens que je ne voulais pas. Donc ce que j'ai fait était

  1. Supprimer la branche localement
  2. Créer une nouvelle branche avec le même nom, assurez-vous de sélectionner la bonne branche de base cette fois-ci
  3. Appliquer le commit ID si vous en avez un

Enfin, j'ai exécuté la commande suivante

git push origin +branchName:branchName

ci-dessus, vous pouvez également utiliser -f à la place de +. La commande ci-dessus a mis ma branche dans un état sans impacter ma pull request.

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