452 Stimmen

Wie bekomme ich "ihre" Änderungen mitten in einem konfliktreichen Git-Rebase?

Ich habe konfliktierende Branches, feature_x abgeleitet von main.

Angenommen, beim Rebasieren von feature_x auf das aktuelle main, entscheide ich mich beim Auflösen von Konflikten, "ihre" (d.h. main) Dateien teilweise so zu übernehmen, wie sie sind. Wie mache ich das?

Ich habe es versucht:

git checkout main:foo/bar.java
fatal: reference is not a tree: TS-modules-tmp:foo/bar.java

git checkout refs/heads/main:foo/bar.java
fatal: reference is not a tree: refs/heads/TS-modules-tmp:foo/bar.java

60 Stimmen

Hinweis: Wenn Sie branch2 auf branch1 erneut basieren, erfolgt die Wiedergabe relativ zu branch1, sodass "theirs" tatsächlich branch2 und "ours" branch1 ist. git.661346.n2.nabble.com/…

3 Stimmen

6 Stimmen

Das hat mich gerade etwa 20 Stunden fleißiger Arbeit gekostet. Ich dachte ehrlich gesagt immer, dass "uns" die Arbeitskopie sein würde.

657voto

iGEL Punkte 14948

Sie möchten verwenden:

git checkout --ours foo/bar.java
git add foo/bar.java

Wenn Sie einen Zweig feature_x gegen main neu basieren (d.h. git rebase main ausführen, während Sie sich auf dem Zweig feature_x befinden), bezieht sich während des Neu-Basieren ours auf main und theirs auf feature_x.

Wie in den git-rebase-Dokumenten erklärt:

Beachten Sie, dass ein Rebase-Merge darin besteht, jeden Commit des Arbeitszweigs auf dem Zweig zu wiederholen. Daher bezieht sich bei einem Merge-Konflikt die Seite, die als ours angezeigt wird, auf die bis dahin neu basierte Serie, beginnend mit , und theirs auf den Arbeitszweig. Mit anderen Worten, die Seiten sind vertauscht.

Weitere Details finden Sie in diesem Thread: hier lesen.

42 Stimmen

Ich bin sicher, dass es einen guten Grund gibt, warum "merge" und "rebase" für "ours" und "theirs" eine entgegengesetzte Bedeutung haben, aber Konsistenz wäre so viel besser gewesen.

1 Stimmen

So their in OPs Frage entspricht --ours im tatsächlichen Befehl.

3 Stimmen

Bitte beachten Sie, dass --ours auch (intuitiver) den 'aktuellen Änderungen' in Ihrer IDE entspricht, wenn Konflikte gelöst werden, während --theirs den 'eingehenden Änderungen' entspricht.

9voto

Adrian Cornish Punkte 22331

Wenn Sie eine bestimmte Datei aus einem anderen Branch ziehen möchten, tun Sie einfach das

git checkout branch1 -- filenamefoo.txt

Dies zieht eine Version der Datei aus einem Branch in den aktuellen Baum

44 Stimmen

Dies wäre wahrscheinlich eine schlechte Idee in der Mitte eines Rebase, da es die Datei vom Kopf dieses Zweigs holen würde, nicht am abgetrennten Kopf, an dem Sie sich in einem konfliktbehafteten Rebase-Zustand befinden würden

1 Stimmen

@Clintm, dagegen ist es eine generische Antwort, dass Sie die Datei von überall her abrufen können. branch1 wäre wie bereits erwähnt keine besonders gute Idee. Aber man kann eine gewünschte Commit-ID verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X