5

Die git checkout documentation sagt:git checkout: detaillierte Bedeutung von "ihnen" und "uns"

--ours --theirs Wenn Pfade aus dem Index Check-out, Check-out Phase # 2 (unsere) oder # 3 (ihre) für nicht zusammengefasste Pfade.

Was bedeutet "stage # 2" und "stage # 3" während der Zusammenführung, Rebase und Cherry-Pick? Gibt es eine Möglichkeit, diese "Stufen" abzufragen, bevor Sie den Befehl ausführen, um sicherzustellen, dass die richtige Version abgerufen wird?

Antwort

5

dokumentieren Diese sind (wenn auch nicht alles, was klar, glaube ich) in the gitrevisions documentation: durch eine Stufennummer (0 bis 3) und ein Doppelpunkt, gefolgt von einem Pfad, Namen optional gefolgt

Ein Doppelpunkt, ein Blob-Objekt im Index am angegebenen Pfad. Eine fehlende Stufennummer (und der darauffolgende Doppelpunkt) benennt einen Eintrag der Stufe 0. Während einer Zusammenführung ist Stufe 1 der gemeinsame Vorgänger, Stufe 2 ist die Version des Zielzweigs (normalerweise der aktuelle Zweig) und Stufe 3 ist die Version aus der Verzweigung, die zusammengeführt wird.

Dazu müssen Sie dann Wissen hinzufügen, wie git rebase und git cherry-pick funktionieren.

Die normale Rosinenpickerei ist wohldefiniert: "unsere" ist die HEAD Version, d. H. Der Zweig, den Sie waren (und immer noch sind), während "ihr" das Commit ist, das Sie aktiv auswählen. Wenn du einen einzelnen Commit auswählst, ist es ziemlich offensichtlich: Phase 1 ist der gemeinsame Vorfahre, Phase 2 ist die Version von der Spitze deines aktuellen Zweigs, und Phase 3 ist die Version, die du gerade pflückst.

Wenn Sie eine Reihe von Commits auswählen, ist dies immer noch wahr, es ist nur iterativ wahr. Nehmen wir an, Sie nehmen zum Beispiel drei Commits in die Hand. Git macht einfach die drei eins nach dem anderen. Während des ersten Cherry-Picks ist Stufe 2 die Spitze deines Zweigs, und Stufe 3 ist die Version vom ersten Commit, die ausgewählt wurde. Sobald der Commit-Cherry-Pick beendet ist, macht Git einen neuen Commit, indem er die Spitze deines Zweigs voranbringt. Dann, während des zweiten Cherry-Picks, ist Stufe 2 die Spitze deines Zweigs, die deinen ersten Kirsch-Pick gemacht hat, und Stufe 3 ist die Version vom zweiten Commit, die ausgewählt wird. Dies wiederholt sich erneut für das endgültige Commit. Jedes Mal ist Stufe # 3 "ihre" Version.

Rebase ist jedoch ein wenig schwierig. Intern beginnt es damit, Sie auf eine neue, anonyme Filiale (einen "abgetrennten HEAD") zu bringen. Dann wird git cherry-pick ausgeführt, um jedes Commit von Ihrem ursprünglichen Zweig auszuwählen. Das bedeutet, dass "unsere" die abgekoppelte HEAD-Version ist, während "ihre" die Version aus Ihrer ursprünglichen Filiale ist. Genau wie "cherry-pick" wiederholt sich dies iterativ für jeden Commit, der ausgewählt werden soll (wörtlich im Fall einer interaktiven Rebase, bei der Sie die Zeilen bearbeiten). Sobald die Rebase beendet ist, mischt git einfach das Zweig-Label herum, so dass der neue anonyme Zweig, den Sie gerade erstellt haben, Ihr Code ist.

Kurz gesagt, Sie können sich von Rebase als "Umkehrung unserer/ihrer Einstellungen" vorstellen - aber das ist eine Übertreibung. Es könnte genauer gesagt sein, dass Stufe 2 Ihr neuer Code ist, den Sie eingemeldet haben, und Stufe 3 ist Ihr alter Code.

3

Die Git documentation for merge (sowie einige andere Orte) erklärt, dass eine Indexdatei Aufzeichnungen bis zu drei Versionen, oder die Stufen:

nach kollidierenden Pfaden, die Indexdatei Datensätze bis zu drei Versionen: Stufe 1 speichert die Version vom gemeinsamen Vorfahren, Stufe 2 von HEAD und Stufe 3 von MERGE_HEAD (Sie können die Stufen mit git ls-files -u untersuchen). Die Arbeitsbaumdateien enthalten das Ergebnis des Programms "Zusammenführen"; d. h. 3-Wege-Zusammenführungsergebnisse mit bekannten Konfliktmarkern < < < === >>>.

Hier ist ein Diagramm, das zeigt, was die drei Stufen in einem typischen Git merge sind:

Common Ancestor -> C1 --- C2   <- MERGE_HEAD (Stage 3) 
(Stage 1)    \ 
         --- C3 --- C4 <- HEAD (Stage 2) 

Dies setzt voraus, dass der Zweig, dessen HEAD wird C4 zurück auf den Zweig in C2 endet verschmolzen wird.

Da die Dokumentation Staaten, können Sie tatsächlich die Etappen anzeigen lassen, indem Sie eingeben:

git ls-files -u 
Verwandte Themen