Git: git rebase sur la branche de développement de l'amont
J'ai locale master
et develop
branches. Je fais tout mon travail sur develop
puis de les fusionner en master
pour les rejets. Il y a une branche distante, upstream/master
qui a des changements que je veux, mais je veux rebase mes modifications dans develop
(qui partage un ancêtre commun) sur le dessus de ses changements et de les remettre dans le develop
. Je l'ai déjà fait git fetch upstream
.
La Git chapitre de livre sur la relocalisation dit de faire:
$ git checkout experiment
$ git rebase master
Que je (penser) dans mon cas signifie:
$ git checkout upstream/master
$ git rebase develop
Mais alors je serais sur le upsteam/master
et dans décollement de la tête de l'état. Cependant, si j'ai fait une fusion de upstream/master
, je ferais ça de develop
, et les changements seraient sur develop
, par exemple
$ git checkout develop
$ git merge upstream/master
Ainsi, de cette façon de rebase semble en arrière pour moi. J'aimerais rebase mes modifications dans develop
sur le develop
de la direction, avec les changements de upstream/master
de la même façon que la fusion de travail. Suis-je censé faire le rebase sur upstream/master
, résoudre les conflits, et de l'ajouter, stash et de la pop sur develop
?
J'espère que cela a un sens et que quelqu'un peut m'aider avec ça, il serait grandement appréciée.
OriginalL'auteur iain | 2013-10-05
Vous devez vous connecter pour publier un commentaire.
Cela serait effectivement:
(
git rebase
devrait se lire: "rebase ma branche courante, icidevelop
, sur le dessus de de la branche cible, iciupstream/master
")Et le résultat final ne serait pas un décollement de la tête, mais le nouveau réécrit
develop
branche.OriginalL'auteur VonC
Le plus simple (le plus évident pour tout le monde) la méthode consiste à mettre à jour votre
master
direction générale d'abord, puis de rebase sur la mise à jourmaster
qui est maintenant exactement la même queorigin/master
:À ce stade, si tout s'est bien passé,
master
etorigin/master
sont les mêmes (comme vous pouvez le voir graphique téléspectateurs commegitk
, ou avecgit log --graph --oneline --decorate
), et il doit être clair commentgit rebase master
fonctionne.Mais vous n'avez pas réellement le faire. Vous pouvez simplement
git rebase origin/master
, tout en étant surdevelop
. (Cela permettra de laisser votremaster
de l'onu-l'avant-ed—sans doute à un certain point, vous voulez en avant-ed—il n'est donc pas vraiment vous sauver beaucoup. Mais il est plus facile de le faire maintenant.)La longue et ennuyeuse "pourquoi" de la partie:
git rebase
prend, dans sa forme longue, trois points de la documentation décrit commenewbase
,upstream
, etbranch
:Si vous spécifiez exactement un argument, comme dans
git rebase master
, que les noms de laupstream
et les deuxnewbase
etbranch
sont calculées. Lebranch
est la branche courante (c'est à dire,HEAD
, qui ne doit pas être détaché). Si vous omettez--onto
, lenewbase
est pris comme leupstream
argument. Donc, si vous êtes surdevelop
maintenant, et que vous exécutezgit rebase X
, lebranch
estdevelop
et les deuxnewbase
etupstream
sontX
.Le rebase méthode est, en effet (il y a diverses optimisations internes et de l'effet sur le reflog est un peu différent):
branch
ORIG_HEAD
) pour l'engager à quibranch
pointsgit reset --hard
) ànewbase
upstream..ORIG_HEAD
1 (dans la plus ancienne à la plus récente commande),git cherry-pick
qui s'engagent pour l'ajouter à la réinitialisation de la branche.Ainsi, comme dans la documentation:
lorsque vous
git rebase master
, vous bénéficiez de:(tout ce que je fait ici est de prendre l'exemple de la page de man et ajouter le
ORIG_HEAD
de l'étiquette et de laHEAD=
, pour montrer qu'à l'origine, les commits sont "toujours là", et queHEAD
est une référence àtopic
).Alors, qu'advient-il si vous avez votre
develop
etmaster
et ils ont leurmaster
qui a un peu plus de changements? Mettons que:Maintenant, vous
git rebase origin/master
:À un certain point, vous passer votre propre
master
au point de commettreD
trop (et vous le déposezORIG_HEAD
):qui est la même chose avec certains des étiquettes déplaçables.
C'est tout ce que la direction générale des étiquettes, ils sont de simples étiquettes. Chaque étiquette points à une (seule) s'engager. Le s'engage point de retour à la précédente s'engage, qui est ce qui construit la validation de l'arbre (ou "commettre des DAG", vraiment).
1
Git's X..Y
syntaxe cache beaucoup de "profondeur de la magie". Il signifie "tous les commits accessible à partir de l'étiquetteY
qui ne sont pas accessibles à partir de l'étiquetteX
. Ce qui est exactement l'ensemble de commits qui ont besoin d'être cerises cueillies, comme ceux qui sont les commits qui ont été surbranch
, et n'étaient pas surupstream
, avant la "rebase" op. Il "ressemble à" un temps de base de la séquence, à première vue, et qui fonctionne, en général, dans la tête des gens, mais il est basé sur la validation graphique de la topologie. Parfois, cela les voyages des gens bien:A..B
, oùA
n'est pas liée àB
à tous (à cause des multiples commettre des arbres dans le repo), signifie "chaque révision, accessible à partir deB
.Merci pour cette très utile, clair et détaillé. Très apprécié.
OriginalL'auteur torek
La commande que vous cherchez est:
Cependant, Git est plus intelligente que ça, vous pouvez configurer amont/master comme en amont de suivi de la branche de développer:
Maintenant, quand vous ne
git rebase
, il utilisera automatiquement " en amont/master. Mais encore mieux, ces commandes:Peut être simplifiée simplement en faisant:
OriginalL'auteur FelipeC