Comment rebaser une branche locale avec un maître distant

934

J'ai un projet cloné d'une branche principale d'un référentiel distant remote_repo. Je crée une nouvelle branche et je m'engage dans cette branche. D'autres programmeurs sont passés remote_repoà la branche principale.

Je dois maintenant rebaser ma branche RB sur remote_repomaster.

Comment faire ça? Quelles commandes taper sur un terminal?

Damir
la source
14
Pour moi, cette question est ambiguë car "avec" pourrait signifier un rebasage dans les deux sens. En regardant les réponses, je vois que l'intention est de rebaser votre branche sur le maître distant, et non l'inverse. Je le mentionne au cas où quelqu'un suit une réponse ci-dessous et obtient l'inverse de ce qu'il veut.
Glenn Lawrence
8
@GlennLawrence Je pense qu'il vaut mieux éditer la question d'origine que d'ajouter un commentaire. Ceci est également encouragé par stackoverflow. En outre, le rebasage du maître sur RB échouera probablement de toute façon, car RB dépend de l'historique du maître.
daniel kullmann

Réponses:

1245

Récupérez d'abord le nouveau maître dans le référentiel en amont, puis rebasez votre branche de travail sur celui-ci:

git fetch origin            # Updates origin/master
git rebase origin/master    # Rebases current branch onto origin/master

Mise à jour : veuillez consulter la réponse de Paul Draper pour une manière plus concise de faire de même - les versions récentes de Git fournissent un moyen plus simple de faire l'équivalent des deux commandes ci-dessus.

Frerich Raabe
la source
16
c'est la seule réponse qui fait ce qui a été demandé
kayaker243
5
@ kayaker243 Non, c'est la même chose que la réponse de Paul Drapers mais en long, je pense.
erik
7
@erik Notez que Paul Draper a écrit sa réponse environ six mois après le commentaire de kayaker243 (et près de deux ans après cette réponse).
Frerich Raabe
3
J'obtiens ce qui suit: Il Your branch and 'origin/b1' have diverged, # and have 3 and 2 different commits each, respectively.semble qu'un autre git pullsoit nécessaire. Est-ce correct ou ai-je raté quelque chose ici?
Dror
2
@RGC Non, git rebase masterne fera pas le même travail que la deuxième commande ( git rebase origin/master) car masteret origin/masterpourrait bien pointer vers des validations différentes (surtout étant donné que la première commande a été git fetch origin, ce qui peut modifier origin/master).
Frerich Raabe
816
git pull --rebase origin master
# where --rebase[=(false|true|merges|preserve|interactive)]
Paul Draper
la source
19
(Équivalent à la réponse de Frerich)
Paul Draper
12
n'est-ce pas légèrement différent de la réponse de Frerich, dans la mesure où cela entraînera des modifications du maître d'origine au maître local, tandis que la réponse de Frerich laisse le maître local intact? (pull vs fetch)
Jimmy Huch
7
Non, dans la réponse de Frerich, le rebase modifie le maître local. Un --rebase de traction est la même chose que FETCH suivi d'un rebasage
argumentum ad hominem
9
Pour info vous pouvez faire des rebases interactifs avecgit pull --rebase=interactive origin master
emmby
14
@adhominem - J'ai vérifié la documentation de git-pull , et je ne vois rien qui supporte l'affirmation selon laquelle le maître local est modifié. Si je suis sur une branche nommée devet exécutée git pull --rebase origin master, seule la branche devva être modifiée, non master. La --rebasedocumentation de l'indicateur indique qu'il tente de rebase the current branch on top of the upstream branch after fetchingrien et rien sur la modification des branches de suivi locales.
Rétablir Monica 2331977
227

Après avoir validé les modifications apportées à votre succursale, masterpassez à la caisse et tirez-la pour obtenir ses dernières modifications du référentiel:

git checkout master
git pull origin master

Ensuite, vérifiez votre succursale et rebasez vos modifications sur master:

git checkout RB
git rebase master

... ou deux dernières commandes sur une seule ligne:

git rebase master RB

Lorsque vous essayez de repousser vers origin/RB, vous obtiendrez probablement une erreur; si vous êtes le seul à travailler RB, vous pouvez forcer la poussée:

git push --force origin RB

... ou comme suit si vous avez configuré git correctement:

git push -f
CharlesB
la source
4
lorsque vous essayez de revenir à l'origine / RB, vous obtiendrez probablement une erreur. Si vous êtes le seul à travailler sur RB, vous pouvez utiliser push --force origin RB. source: stackoverflow.com/questions/8939977/…
Joey Baruch
1
Ah .... j'ai exactement ça. mon "RB" est rebasé correctement, mais j'obtiens des erreurs sans fin lorsque j'essaye de le pousser après le rebase. Mis à part push --force origin RB - y a-t-il une façon "plus agréable" (non forcée) de le faire? J'essaie juste de comprendre la perception des gits ici - et j'échoue.
Motti Shneor
2
@MottiShneor Non, il n'y a pas de bonne façon. Si quelqu'un d'autre pousse à la succursale dans l'intervalle, leurs modifications seront perdues! Si vous voulez être gentil avec l'historique des commits git, vous devriez plutôt fusionner master dans votre branche, ce qui est sûr (vous pouvez vous en git pushpasser -f).
daniel kullmann
110

Remarque: Si vous avez déjà une large connaissance du rebasage, utilisez ci-dessous une doublure pour un rebasage rapide. Solution: en supposant que vous êtes sur votre branche active et que vous êtes la seule personne à y travailler.

git fetch && git rebase origin/master

Résolvez tous les conflits, testez votre code, validez et envoyez de nouvelles modifications à la branche distante.

                            ~:   For noobs   :~

Les étapes suivantes peuvent aider quiconque est nouveau git rebaseet souhaite le faire sans tracas

Étape 1: en supposant qu'il n'y a pas de validations et de modifications à effectuer sur YourBranch à ce stade. Nous visitons YourBranch.

git checkout YourBranch
git pull --rebase

Qu'est-il arrivé? Récupère toutes les modifications apportées par d'autres développeurs travaillant sur votre branche et rebase vos modifications par-dessus.

Étape 2: résoudre tous les conflits qui se présentent.

Étape 3:

git checkout master
git pull --rebase

Qu'est-il arrivé? Extrait toutes les dernières modifications du maître distant et rebase le maître local sur le maître distant. Je garde toujours le maître à distance propre et prêt à être libéré! Et, préférez travailler uniquement sur le maître ou les succursales localement. Je recommande de le faire jusqu'à ce que vous obteniez un coup de main sur les modifications ou les validations de git. Remarque: Cette étape n'est pas nécessaire si vous ne gérez pas le maître local, mais vous pouvez effectuer une extraction et un rebase du maître distant directement sur la branche locale directement. Comme je l'ai mentionné en une seule étape au début.

Étape 4: résoudre tous les conflits qui se présentent.

Étape 5:

git checkout YourBranch
git rebase master

Qu'est-il arrivé? Le rebase sur le maître se produit

Étape 6: Résolvez tous les conflits, s'il y a des conflits. Utilisez git rebase --continuepour continuer le rebase après avoir ajouté les conflits résolus. À tout moment, vous pouvez utiliser git rebase --abortpour abandonner le rebasage.

Étape 7:

git push --force-with-lease 

Qu'est-il arrivé? Apporter des modifications à votre télécommande YourBranch. --force-with-leases'assurera qu'il y a d'autres changements entrants pour YourBranch d'autres développeurs pendant que vous rebasez. C'est super utile plutôt que de forcer la poussée. En cas de modifications entrantes, récupérez-les pour mettre à jour votre YourBranch local avant de pousser les modifications.

Pourquoi dois-je pousser les changements? Pour réécrire le message de validation dans YourBranch distant après un rebasage approprié ou S'il y a des conflits résolus? Ensuite, vous devez transférer les modifications que vous avez résolues dans le référentiel local vers le référentiel distant de YourBranch

Yahoooo ...! Vous avez terminé avec succès le rebasage.

Vous pourriez également envisager de faire:

git checkout master
git merge YourBranch

Quand et pourquoi? Fusionnez votre branche en maître si vous effectuez des modifications par vous et d'autres codéveloppeurs. Ce qui rend YourBranch à jour avec master lorsque vous souhaitez travailler sur la même branche plus tard.

                            ~:   (๑ơ ₃ ơ)♥ rebase   :~
bh4r4th
la source
À quoi cela sert-il: "Extrait toutes les dernières modifications du maître et rebase le maître sur le dernier maître". Rebaser maître sur maître? N'avez-vous pas juste besoin de tirer le dernier maître?
John Little
@JohnLittle Merci d'avoir souligné. Je veux dire Pulls latest changes from remote master to local master. I always prefer keeping remote master clean and release ready always!. Je mettrai à jour ma description.
bh4r4th
21

Étape 1:

git fetch origin

Étape 2:

git rebase origin/master

Étape 3: (Corrigez en cas de conflit)

git add .

Étape 4:

git rebase --continue

Étape 5:

git push --force
GauthamManivannan
la source
5
Aucune explication sur la branche sur laquelle commencer. Pas une bonne réponse.
Karl Morrison
12

1.Mettez à jour le maître en premier ...

git checkout [master branch]
git pull [master branch]

2.Bassez maintenant la source-branche avec la branche principale

git checkout [source branch]
git rebase [master branch]
git pull [source branch] (remote/source branch)
git push [source branch]

SI la branche source n'existe pas encore sur la télécommande, alors:

git push -u origin [source branch]

"et voilà..."

N Djel Okoye
la source
J'aime la nature étape par étape de cette réponse. Cela aide à décomposer ce qui se passe exactement.
Dave Liu
6

git fetch origin master:master extrait la dernière version de master sans avoir à la vérifier.

Il vous suffit donc:

git fetch origin master:master && git rebase master 👌

Naz
la source
Ne met pas à git fetchjour le maître sans avoir besoin de le vérifier aussi? Sauf que les mises à jour git fetchne sont-elles pas git mergecorrectes? Donc, si nous vérifions, masteril n'aura pas les dernières mises à jour. Alors, n'est-ce pas plus court à faire lorsque vous êtes sur une branche de fonctionnalité, git fetchalors git rebase origin/master? Nous ne pouvons pas le faire, git rebase mastercar cela tentera de rebaser à partir masterde l'espace de travail, nous devons origin/masterobtenir du non fusionné mais assis dans le local.
Noitidart