Lorsque je fais un rebase git, j'ai souvent du mal à comprendre ce qui se passe avec le «local» et le «distant» lors de la résolution de conflits. J'ai parfois l'impression qu'ils changent de camp d'un engagement à l'autre.
C'est probablement (définitivement) parce que je n'ai toujours pas bien compris.
Lors du rebasage, qui est «local» et qui est «distant»?
(J'utilise P4Merge pour résoudre les conflits)
git svn
partie ` `, juste pour lagit rebase
partie ' ')Réponses:
TL, DR;
Pour résumer (comme le commente Benubird ), quand:
local
estB
(rebase sur ),remote
estA
Et:
local
estA
(fusionner dans ),remote
estB
Un rebase bascule
ours
(branche actuelle avant le début du rebase) ettheirs
(la branche au-dessus de laquelle vous voulez rebase).kutschkem souligne que, dans un contexte de mergetool d'interface graphique :
ours
" (la branche amont)theirs
" - la branche actuelle avant le rebase.Voir les illustrations dans la dernière partie de cette réponse.
Inversion lors du rebase
La confusion pourrait être liée à l' inversion de
ours
ettheirs
pendant un rebase .(extraits pertinents)
git rebase
page de manuel :Pour cette raison, lorsqu'un conflit de fusion se produit:
ours
` est la série rebasée jusqu'à présent, commençant par<upstream>
,theirs
' est la branche active. En d'autres termes, les côtés sont échangés.Inversion illustrée
Sur une fusion
, nous ne changeons pas la branche actuelle 'B', donc ce que nous avons est toujours ce sur quoi nous travaillions (et nous fusionnons depuis une autre branche)
Sur un rebase:
Mais sur un rebase , on change de côté car la première chose qu'un rebase fait est de vérifier la branche amont! (pour rejouer les commits actuels dessus)
A
git rebase upstream
passera d'abordHEAD
de B à la branche amontHEAD
(d'où le changement de «le nôtre» et «le leur» par rapport à la branche de travail «actuelle» précédente)., puis le rebase rejouera 'leurs' commits sur la nouvelle branche B 'notre':
Remarque: la notion «amont» est l'ensemble référentiel de données (un tout repo ou, comme ici, une branche, qui peut être une branche locale ) à partir duquel les données sont lues ou auxquelles de nouvelles données sont ajoutées / créées.
'
local
' et 'remote
' contre 'mine
' et 'theirs
'Pandawood ajoute dans les commentaires :
GUI git mergetool
kutschkem ajoute, et à juste titre:
ours
" (la branche amont)theirs
" - la branche actuelle avant le rebase.git mergetool
mentionne en effet «local» et «distant» :Par exemple, KDiff3 serait afficher la résolution de fusion comme ceci :
Et meld l' afficherait aussi :
Idem pour VimDiff , qui affiche :
la source
git checkout A; git rebase B
local est B, distant est A. Tout ce que j'avais besoin de savoir ...git checkout A; git rebase B
est locale B, est à distance A . Si jecheckout A
puis je suis actuellement à la recherche les fichiers tels qu'ils existent surA
, comment est - ce de quelque façon que la distance ? (Je ne dis pas que Benubird a tort; je dis que git a un UX stupide){branch A}
et /{branch B}
ou similaire.La ligne du bas
git rebase
git merge
En d'autres termes, LOCAL est toujours l'original, et REMOTE est toujours le gars dont les commits n'étaient pas là avant, car ils sont fusionnés ou rebasés par-dessus
Prouve le!
Certainement. Ne me croyez pas sur parole! Voici une expérience facile que vous pouvez faire pour voir par vous-même.
Tout d'abord, assurez-vous que git mergetool est correctement configuré. (Sinon, vous ne liriez probablement pas cette question de toute façon.) Trouvez ensuite un répertoire dans lequel travailler.
Configurez votre référentiel:
Créez un commit initial (avec un fichier vide):
Créez un commit sur une branche qui n'est pas master:
Créez un commit sur la branche master:
À ce stade, votre référentiel devrait ressembler à ceci:
Maintenant, pour le test de rebase:
Maintenant, le test de fusion. Fermez votre outil de fusion sans enregistrer les modifications, puis annulez le rebase:
Ensuite:
Vos résultats doivent être les mêmes que ceux affichés en haut.
la source
local
/remote
avec lesquels j'ai lutté dans ma propre réponse ci-dessus (qui parle plus de l'inversion deours
vs detheirs
toute façon)Je n'ai pas compris votre problème exactement, mais je pense que le diagramme suivant résout votre problème. (Rebase: Référentiel distant ---> Espace de travail)
Source: Mon flux de travail Git
la source