Comment rebasez-vous les modifications de la branche actuelle en plus des modifications en cours de fusion?

144

D'accord. Si je suis sur une branche (par exemple working), et que je veux fusionner les modifications d'une autre branche (par exemple master), alors j'exécute la commande git-merge mastersur la workingbranche, et les modifications sont fusionnées sans rebaser l'historique du tout. Si je cours git-rebase master, les modifications dans mastersont rebasées pour être placées en haut de ma workingbranche. Mais que se passe-t-il si je veux fusionner les modifications de mastermais rebaser mes modifications workingpour être au top? Comment je fais ça? Cela peut-il être fait?

Je pourrais courir git-rebase workingsur ma masterbranche pour mettre mes modifications en tête dans la masterbranche, mais j'aimerais pouvoir le faire dans ma workingbranche, et je ne sais pas comment. Le plus proche que je puisse penser est de créer une nouvelle branche à partir de masterpuis de rebaser workingles modifications apportées par-dessus, mais j'aurais alors une nouvelle branche au lieu de la modifier working.

Jonathan M Davis
la source

Réponses:

255

Vous avez ce qui rebasefait à l'envers. git rebase masterfait ce que vous demandez - prend les changements sur la branche actuelle (depuis sa divergence par rapport au maître) et les rejoue par-dessus master, puis définit la tête de la branche actuelle pour être la tête de cette nouvelle histoire. Il ne rejoue pas les modifications depuis masterle sommet de la branche actuelle.

Hobbs
la source
3
@Jonathan c'est cool. C'est un sujet un peu délicat. À propos, git rebase workingdéplacerait masterles modifications (après le point qui workings'est ramifié) pour être au sommet de la workingbranche - mais ce n'est pas une chose très sensée à faire pour master:)
hobbs
66

Une autre façon de voir cela est de considérer git rebase mastercomme:

Rebase la branche actuelle au-dessus de master

Ici, ' master' est la branche amont , et cela explique pourquoi, lors d'un rebase, ourset theirssont inversés .

VonC
la source
Cela explique également pourquoi LOCAL et REMOTE sont inversés. Merci.
AVIDeveloper
@AVIDeveloper sur LOCAL et REMOTE, vous pouvez également lire stackoverflow.com/a/3052118/6309
VonC
5
@@ VonC: Merci. Oui, après avoir passé un après-midi à me marmonner "REMOTE is my branch .. LOCAL is not mine", tout s'est enfoncé. Honnêtement, j'aurais préféré voir les noms des succursales (ou l'abréviation. SHA) au lieu de REMOTE / LOCAL / le nôtre / le leur / le mien. Mes pensées sont les mêmes concernant l git difftool'horrible gauche / droite de l'. Un peu hors sujet, mais pour difftoolmoi, je m'en tiens à git-meld et j'aime les noms comme "working-dir", "stash @ {0}", etc.
AVIDeveloper
1
@VonC: Pouvez-vous expliquer comment se fait-il qu'après nous: git checkout branch_to_update git rebase masterj'obtiens dans git log les commits de master au-dessus de la branche locale, au contraire?
JavaSa
1
@JavaSa C'est étrange, à moins que le rebase ne soit pas correctement terminé? Vous devrez peut-être poser une question distincte avec plus de détails.
VonC