Ich vermute, dass du hier verwirrt bist, weil es grundsätzlich verwirrend ist. Um die Dinge noch schlimmer zu machen, wird das ganze "unser/ihre" Zeug vertauscht (wird umgekehrt), wenn du ein Rebase durchführst.
Letztendlich, während eines git merge
, bezieht sich der "unser" Branch auf den Branch, den du zusammenführst in:
git checkout merge-into-ours
und der "ihr" Branch bezieht sich auf den (einzigen) Branch, den du zusammenführst:
git merge from-theirs
und hier ergibt "unser" und "ihr" schon Sinn, denn obwohl "ihr" höchstwahrscheinlich sowieso deiner ist, ist "ihr" nicht der, auf dem du warst, als du git merge
ausgeführt hast.
Obwohl die Verwendung des tatsächlichen Branch-Namens ziemlich cool sein könnte, funktioniert es in komplexeren Fällen nicht. Beispielsweise könntest du anstelle des obigen folgendes tun:
git checkout ours
git merge 1234567
wo du durch eine rohe Commit-ID zusammenführst. Schlimmer noch, du könntest sogar das hier tun:
git checkout 7777777 # HEAD abkoppeln
git merge 1234567 # einen Test-Merge durchführen
in diesem Fall sind keine Branch-Namen involviert!
Ich glaube, das hilft wenig hier, aber tatsächlich kannst du mit der gitrevisions
-Syntax in einem Konflikt-Merge auf einen individuellen Pfad im Index durch Nummer verweisen
git show :1:README
git show :2:README
git show :3:README
Phase #1 ist der gemeinsame Vorgänger der Dateien, Phase #2 ist die Ziel-Branch-Version und Phase #3 ist die Version, von der du zusammenführst.
Der Grund, warum die "unser" und "ihr" Bezeichnungen während eines rebase
vertauscht werden, ist, dass Rebase durch eine Serie von Cherry-Picks funktioniert, in einem anonymen Branch (entkoppelter HEAD-Modus). Der Ziel-Branch ist der anonyme Branch und der Merge-From-Branch ist dein originaler (vor dem Rebase) Branch: also bedeutet "--ours" der anonyme, den Rebase erstellt, während "--theirs" "unser Branch, der rebased wird" bedeutet.
Was den Eintrag in den gitattributes betrifft: Er könnte eine Auswirkung haben: "unser" bedeutet intern wirklich "Phase #2 verwenden". Aber wie du bemerkt hast, ist er zu diesem Zeitpunkt nicht tatsächlich vorhanden, also sollte er hier keine Auswirkung haben... es sei denn, du kopierst ihn vor dem Start in das Arbeitsverzeichnis.
Außerdem, übrigens, das gilt für alle Verwendungen von unser und ihr, einige sind auf Dateiebene (-s unser
für eine Merge-Strategie; git checkout --ours
während eines Merge-Konflikts) und manche sind auf Stück-für-Stück-Basis (-X unser
oder -X ihr
während eines -s rekursiven
Merges). Das trägt wahrscheinlich nicht zur Aufklärung bei.
Ich habe nie einen besseren Namen für diese gefunden. Und: siehe VonCs Antwort auf eine andere Frage, wo git mergetool
noch mehr Namen für diese einführt und sie "lokal" und "remote" nennt!