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"!