Ich vermute, Sie sind hier verwirrt, weil es grundsätzlich verwirrend ist. Um die Sache noch schlimmer zu machen, wechselt unser gesamtes Zeug die Rollen (wird rückwärts), wenn Sie eine Rebase durchführen.
Letztlich während ein git merge
, bezieht sich der „unsere“ Zweig mit dem Zweig Sie verschmelzen in :
git checkout merge-into-ours
und der Zweig "ihnen" bezieht sich auf den (einzelnen) Zweig, den Sie zusammenführen:
git merge from-theirs
und hier machen "unsere" und "ihre" einen Sinn, denn obwohl "ihre" wahrscheinlich sowieso deine sind, ist "ihre" nicht die, auf der du warst, als du gelaufen bist git merge
.
Die Verwendung des tatsächlichen Zweignamens mag zwar ziemlich cool sein, fällt jedoch in komplexeren Fällen auseinander. Anstelle der oben genannten Schritte können Sie beispielsweise Folgendes tun:
git checkout ours
git merge 1234567
wo Sie durch rohe Commit-ID zusammenführen. Schlimmer noch, Sie können dies sogar tun:
git checkout 7777777 # detach HEAD
git merge 1234567 # do a test merge
In diesem Fall sind keine Filialnamen beteiligt!
Ich denke, es ist hier wenig hilfreich, aber tatsächlich können Sie in der gitrevisions
Syntax während einer Konfliktzusammenführung auf einen einzelnen Pfad im Index nach Zahlen verweisen
git show :1:README
git show :2:README
git show :3:README
Stufe 1 ist der gemeinsame Vorfahr der Dateien, Stufe 2 ist die Zielverzweigungsversion und Stufe 3 ist die Version, aus der Sie zusammenführen.
Der Grund, warum die Begriffe "unsere" und "ihre" rebase
währenddessen ausgetauscht werden, ist, dass die Rebase durch eine Reihe von Cherry-Picks in einen anonymen Zweig (getrennter HEAD-Modus) funktioniert. Der Zielzweig ist der anonyme Zweig, und der Merge-from-Zweig ist Ihr ursprünglicher Zweig (vor dem Rebase). "--Ours" bedeutet also, dass der anonyme Rebase erstellt wird, während "--theirs" bedeutet, dass "unser Zweig neu basiert". .
Was den Eintrag gatattributes betrifft: Es könnte einen Effekt haben: "unser" bedeutet wirklich "Stufe 2 intern verwenden". Aber wie Sie bemerken, ist es zu diesem Zeitpunkt noch nicht vorhanden, daher sollte es hier keine Auswirkungen haben ... nun, es sei denn, Sie kopieren es in den Arbeitsbaum, bevor Sie beginnen.
Dies gilt übrigens auch für alle Verwendungszwecke von uns und von ihnen, aber einige befinden sich auf der Ebene einer ganzen Datei ( -s ours
für eine Zusammenführungsstrategie; git checkout --ours
während eines Zusammenführungskonflikts) und einige sind Stück für Stück ( -X ours
oder -X theirs
während eines Zusammenführungskonflikts)-s recursive
verschmelzen). Was wahrscheinlich bei keiner Verwirrung hilft.
Ich habe mir jedoch nie einen besseren Namen dafür ausgedacht. Und: siehe VonCs Antwort auf eine andere Frage, in git mergetool
der noch weitere Namen für diese eingeführt werden, die als "lokal" und "fern" bezeichnet werden!
Das ' unsere ' in Git bezieht sich auf den ursprünglichen Arbeitszweig, der einen maßgeblichen / kanonischen Teil der Git-Geschichte hat.
Das " ihre " bezieht sich auf die Version, die das Werk enthält, um neu basiert zu werden (Änderungen, die auf dem aktuellen Zweig wiedergegeben werden sollen).
Dies scheint auf Personen übertragen zu werden, die sich nicht bewusst sind, dass das Umbasieren (z. B.
git rebase
) Ihre Arbeit tatsächlich auf Eis legt ( was ihnen gehört ), um die kanonische / Hauptgeschichte, die uns gehört , erneut abzuspielen, weil wir unsere umbasieren Änderungen als Arbeit von Drittanbietern.Die Dokumentation für
git-checkout
wurde in Git> = 2.5.1 gemäßf303016
Commit weiter präzisiert :Denn
git-merge
es wird folgendermaßen erklärt:Außerdem wird hier erklärt, wie man sie benutzt:
So kann es manchmal verwirrend sein, zum Beispiel:
git pull origin master
Wo-Xours
ist unsere lokale,-Xtheirs
ist ihre (entfernte) Niederlassunggit pull origin master -r
Wo-Xours
ist ihre (abgelegen),-Xtheirs
ist unsereDas zweite Beispiel ist also dem ersten entgegengesetzt, da wir unseren Zweig über dem entfernten neu aufbauen, sodass unser Ausgangspunkt der entfernte ist und unsere Änderungen als extern behandelt werden.
Ähnliches gilt für
git merge
Strategien (-X ours
und-X theirs
).quelle
git merge
, abergit pull
undgit checkout
als Beispiel. Wenn Sie diesen Parameter mit verwenden möchtengit merge
, sollten Sie verwenden-X ours
. Sie können weiterhin die--ours
Syntax für verwendengit checkout
. Ich habe die Antwort weiter geklärt.Ich weiß, dass dies beantwortet wurde, aber dieses Problem hat mich so oft verwirrt, dass ich eine kleine Referenz-Website eingerichtet habe, um mich daran zu erinnern: https://nitaym.github.io/ourstheirs/
Hier sind die Grundlagen:
Zusammenführungen:
Wenn Sie die Version auswählen möchten in
master
:Wenn Sie die Version auswählen möchten in
feature
:Rebases:
Wenn Sie die Version auswählen möchten in
master
:Wenn Sie die Version auswählen möchten in
feature
:(Dies ist natürlich für vollständige Dateien)
quelle
Also , wenn Sie auf dem Zweig Release / 2.5 und Sie fusionieren Zweig Funktion / new-Tasten hinein, dann den Inhalt wie in gefunden Release / 2.5 ist das, was uns betrifft und den Inhalt als auch gefunden Funktion / new-Tasten ist das, was ihnen bezieht sich zu. Während einer Zusammenführungsaktion ist dies ziemlich einfach.
Das einzige Problem, auf das die meisten Menschen hereinfallen, ist der Rebase-Fall . Wenn Sie anstelle einer normalen Zusammenführung eine Neubasis durchführen, werden die Rollen vertauscht. Wie ist das? Nun, das liegt ausschließlich an der Art und Weise, wie das Rebasieren funktioniert. Denken Sie an Rebase, um so zu arbeiten:
Natürlich ist das nicht wirklich so, aber es ist ein schönes Denkmodell für mich. Und wenn Sie sich 2 und 3 ansehen, werden Sie verstehen, warum die Rollen jetzt vertauscht werden. Ab 2 ist Ihr aktueller Zweig jetzt der Zweig vom Server ohne Ihre Änderungen. Dies ist also unser Zweig (der Zweig, in dem Sie sich befinden). Die Änderungen, die Sie vorgenommen haben, befinden sich jetzt in einem anderen Zweig, der nicht Ihr aktueller ist ( BranchX ). Daher sind diese Änderungen (obwohl es sich um die von Ihnen vorgenommenen Änderungen handelt) ihre (der andere Zweig, der in Ihrer Aktion verwendet wird).
Das bedeutet, wenn Sie zusammenführen und möchten, dass Ihre Änderungen immer gewinnen, würden Sie git anweisen, immer "unsere" zu wählen. Wenn Sie jedoch neu festlegen und möchten, dass alle Ihre Änderungen immer gewinnen, weisen Sie git an, immer "ihre" zu wählen.
quelle
Ich weiß, dass es die Bedeutung nicht erklärt, aber ich habe mir ein kleines Bild gemacht, um daran zu erinnern, welches ich verwenden soll:
Ich hoffe es hilft!
PS - Überprüfen Sie auch den Link in Nitays Antwort 🙂
quelle
Ich werde mein Memo hier posten, weil ich immer wieder hierher zurückkommen muss.
SZENARIO 1. Normaler Entwickler: Sie sind Entwickler, die nicht
master
mitfeature
Zweigen zusammengeführt werden können und nur mit diesen spielen müssen .Fall 1: Meister ist ein König. Sie möchten Ihren
feature
Zweig aktualisieren (= Basis neu erstellenmaster
), da ermaster
neue Aktualisierungen von Abhängigkeiten enthält und Sie Ihre bescheidenen Änderungen überschreiben möchten.Fall 2: Du bist ein König. Sie möchten Ihren
feature
Zweig aufmaster
Änderungen zurücksetzen . Aber Sie haben mehr getan als Ihre Kollegen und möchten Ihre eigenen Änderungen vorrangig nutzen.WICHTIG: Wie Sie sehen können, sollten normale Entwickler es vorziehen
rebase
und jeden Morgen wie Übungen / Kaffee wiederholen.SZENARIO 2. Merging-Sensei: Sie sind ein Teamleiter und möchten andere Zweige zusammenführen und ein zusammengeführtes Ergebnis direkt an einen Master senden .
master
ist ein Zweig, den Sie ändern werden.Fall 1: Meister ist ein König Sie möchten einen Zweig
master
eines Drittanbieters zusammenführen, haben jedoch Priorität.feature
ist ein Zweig, den Ihr Senior gemacht hat.Fall 2: Neue Änderungen sind ein König Wenn Ihr leitender Entwickler eine coole Version veröffentlicht hat
feature
und Sie die alten Änderungen in dermaster
Branche überschreiben möchten .ERINNERUNG: Um in einem Mitternacht zu erinnern , die man wählen:
master
istours
IMMER. Undtheirs
ist einefeature
, die ihre getan haben.quelle
Aus
git checkout
der Verwendung:Wenn Merge Konflikte zu lösen, können Sie tun
git checkout --theirs some_file
, undgit checkout --ours some_file
die Datei auf die aktuelle Version und die eingehenden Versionen jeweils zurückgesetzt werden .Wenn Sie die Datei auf die 3-Wege-Zusammenführungsversion der Datei zurückgesetzt haben
git checkout --ours some_file
odergit checkout --theirs some_file
zurücksetzen möchten, können Sie dies tungit checkout --merge some_file
.quelle