Je suppose que vous êtes confus ici parce que c'est fondamentalement déroutant. Pour aggraver les choses, tout le nôtre / le leur change de rôle (devient à l'envers) lorsque vous effectuez un rebase.
En fin de compte, au cours d' une git merge
, la branche se réfère à la branche « la nôtre » vous fusionnez dans :
git checkout merge-into-ours
et la branche "leur" fait référence à la branche (unique) que vous fusionnez:
git merge from-theirs
et ici "les nôtres" et "les leurs" ont un certain sens, car même si "les leurs" sont probablement les vôtres de toute façon, "les leurs" n'est pas celui sur lequel vous étiez lorsque vous avez couru git merge
.
Bien que l'utilisation du nom de la branche réelle puisse être plutôt cool, elle se désagrège dans des cas plus complexes. Par exemple, au lieu de ce qui précède, vous pouvez faire:
git checkout ours
git merge 1234567
où vous fusionnez par raw commit-ID. Pire, vous pouvez même faire ceci:
git checkout 7777777 # detach HEAD
git merge 1234567 # do a test merge
dans ce cas, aucun nom de branche n'est impliqué!
Je pense que c'est peu utile ici, mais en fait, dans la gitrevisions
syntaxe , vous pouvez faire référence à un chemin individuel dans l'index par numéro, lors d'une fusion en conflit
git show :1:README
git show :2:README
git show :3:README
L'étape # 1 est l'ancêtre commun des fichiers, l'étape # 2 est la version de la branche cible et l'étape # 3 est la version à partir de laquelle vous fusionnez.
La raison pour laquelle les notions "les nôtres" et "les leurs" sont échangées pendant rebase
que le rebase fonctionne en faisant une série de choix de cerises, dans une branche anonyme (mode HEAD détaché). La branche cible est la branche anonyme, et la branche issue de la fusion est votre branche d'origine (pré-rebase): donc "--ours" signifie que le rebase anonyme est en train de se construire tandis que "--theirs" signifie "notre branche est rebasée" .
Quant à l'entrée gitattributes: elle pourrait avoir un effet: «la nôtre» signifie vraiment «utiliser l'étape 2» en interne. Mais comme vous le constatez, il n'est pas réellement en place à ce moment-là, donc cela ne devrait pas avoir d'effet ici ... enfin, sauf si vous le copiez dans l'arbre de travail avant de commencer.
Soit dit en passant, cela s'applique à toutes les utilisations de la nôtre et de la leur, mais certaines sont au niveau d'un fichier entier ( -s ours
pour une stratégie de fusion; git checkout --ours
pendant un conflit de fusion) et certaines sont au coup par coup ( -X ours
ou -X theirs
pendant un -s recursive
fusionner). Ce qui n'aide probablement pas avec la confusion.
Je n'ai jamais trouvé de meilleur nom pour ces derniers, cependant. Et: voir la réponse de VonC à une autre question, où git mergetool
introduit encore plus de noms pour ceux-ci, les appelant "locaux" et "distants"!
Le ' nôtre ' dans Git fait référence à la branche de travail d'origine qui a une partie autoritaire / canonique de l'histoire de Git.
Le « leur » fait référence à la version qui contient le travail afin d'être rebasé (modifications à rejouer sur la branche actuelle).
Cela peut sembler être échangé à des personnes qui ne savent pas que le rebasage (par exemple
git rebase
) prend en fait votre travail en attente (qui est le leur ) afin de rejouer sur l'histoire canonique / principale qui est la nôtre , parce que nous rebasons notre modifications en tant que travail tiers.La documentation de a
git-checkout
été clarifiée dans Git> = 2.5.1 selon laf303016
validation :Car
git-merge
c'est expliqué de la manière suivante:De plus, voici comment les utiliser:
Parfois, cela peut être déroutant, par exemple:
git pull origin master
où-Xours
est notre section locale,-Xtheirs
leur succursale (distante)git pull origin master -r
où-Xours
est la leur (à distance), la-Xtheirs
nôtreDonc le 2ème exemple est opposé au 1er, parce que nous rebasons notre branche au-dessus de la distante, donc notre point de départ est distant, et nos changements sont traités comme externes.
Similaire pour les
git merge
stratégies (-X ours
et-X theirs
).la source
git merge
, maisgit pull
et àgit checkout
titre d'exemple. Si vous souhaitez utiliser ce paramètre avecgit merge
, vous devez utiliser-X ours
. Vous pouvez toujours utiliser la--ours
syntaxe pourgit checkout
. J'ai clarifié davantage la réponse.Je sais que cela a été répondu, mais ce problème m'a confus tant de fois que j'ai mis en place un petit site Web de référence pour m'aider à me souvenir: https://nitaym.github.io/ourstheirs/
Voici les bases:
Fusionne:
Si vous souhaitez sélectionner la version dans
master
:Si vous souhaitez sélectionner la version dans
feature
:Rebases:
Si vous souhaitez sélectionner la version dans
master
:Si vous souhaitez sélectionner la version dans
feature
:(C'est pour les fichiers complets, bien sûr)
la source
Donc, si vous êtes sur la version de branche / 2.5 et que vous y fusionnez la fonction de branche / nouveaux-boutons , le contenu tel que trouvé dans la version / 2.5 est ce à quoi le nôtre fait référence et le contenu que l'on trouve sur la fonction / nouveaux-boutons est ce à quoi leur fait référence à. Pendant une action de fusion, c'est assez simple.
Le seul problème pour lequel la plupart des gens tombent est le cas de rebase . Si vous effectuez une nouvelle base au lieu d'une fusion normale, les rôles sont échangés. Comment ça? Eh bien, cela est uniquement dû à la façon dont le rebasage fonctionne. Pensez à rebaser pour travailler comme ça:
Bien sûr, ce n'est pas vraiment ce qui se passe, mais c'est un bon modèle mental pour moi. Et si vous regardez 2 et 3, vous comprendrez pourquoi les rôles sont échangés maintenant. Depuis le 2, votre branche actuelle est maintenant la branche du serveur sans aucune de vos modifications, donc c'est la nôtre (la branche sur laquelle vous êtes). Les modifications que vous avez apportées sont désormais sur une branche différente qui n'est pas la vôtre ( BranchX ) et donc ces modifications (bien qu'elles soient les modifications que vous avez apportées) sont les leurs (l'autre branche utilisée dans votre action).
Cela signifie que si vous fusionnez et que vous voulez que vos modifications gagnent toujours, vous diriez à git de toujours choisir "les nôtres" mais si vous rebase et que vous voulez que toutes vos modifications gagnent toujours, vous dites à git de toujours choisir "les leurs".
la source
Je sais que cela n'explique pas le sens mais je me suis fait une petite image, comme référence pour rappeler laquelle utiliser:
J'espère que ça aide!
PS - Vérifiez également le lien dans la réponse de Nitay 🙂
la source
Je posterai ma note ici, car je dois revenir ici encore et encore.
SCÉNARIO 1. Développeur normal: vous êtes un développeur qui ne peut pas fusionner
master
et ne doit jouer qu'avec desfeature
branches.Cas 1: le maître est un roi. Vous souhaitez actualiser votre
feature
branche (= rebase tomaster
), carmaster
contient de nouvelles mises à jour des dépendances et vous souhaitez écraser vos modestes modifications.Cas 2: vous êtes roi. Vous souhaitez rebaser votre
feature
branche auxmaster
modifications. Mais vous avez fait plus que vos collègues et vous souhaitez utiliser vos propres changements en priorité.IMPORTANT: Comme vous pouvez le voir, les développeurs normaux devraient préférer
rebase
et répéter chaque matin comme des exercices / du café.SCÉNARIO 2. Fusion-sensei: Vous êtes un chef d'équipe et vous souhaitez fusionner d'autres branches et envoyer un résultat fusionné directement à un maître.
master
est une branche que vous allez changer.Cas 1: le maître est un roi Vous voulez fusionner une branche tierce, mais
master
c'est une priorité.feature
est une branche que votre senior a fait.Cas 2: les nouveaux changements sont un roi Lorsque votre développeur senior a publié un cool
feature
et que vous souhaitez remplacer l'ancien s ** t dans lamaster
branche.RAPPELEZ-VOUS: Se rappeler à minuit lequel choisir:
master
c'estours
TOUJOURS. Ettheirs
c'est cefeature
que les leurs ont fait.la source
De
git checkout
l'utilisation de:Lors de la résolution des conflits de fusion, vous pouvez le faire
git checkout --theirs some_file
etgit checkout --ours some_file
réinitialiser le fichier à la version actuelle et aux versions entrantes respectivement.Si vous avez effectué
git checkout --ours some_file
ougit checkout --theirs some_file
souhaitez réinitialiser le fichier dans la version de fusion à 3 voies du fichier, vous pouvez le fairegit checkout --merge some_file
.la source