Es ist nicht ganz klar, was das gewünschte Ergebnis ist, so dass in den Antworten und Kommentaren eine gewisse Verwirrung über die "richtige" Vorgehensweise herrscht. Ich versuche, einen Überblick zu geben und sehe die folgenden drei Möglichkeiten:
Versuchen Sie die Zusammenführung und verwenden Sie B für Konflikte
Dies ist pas die "ihre Version für git merge -s ours
", sondern die "ihre Version für git merge -X ours
"(das ist die Abkürzung für git merge -s recursive -X ours
) :
git checkout branchA
# also uses -s recursive implicitly
git merge -X theirs branchB
Dies ist z. B. der Fall. Alan W. Smiths Antwort tut.
Nur Inhalte aus B verwenden
Dies erzeugt einen Merge Commit für beide Zweige, verwirft aber alle Änderungen aus branchA
und behält nur die Inhalte von branchB
.
# Get the content you want to keep.
# If you want to keep branchB at the current commit, you can add --detached,
# else it will be advanced to the merge commit in the next step.
git checkout branchB
# Do the merge an keep current (our) content from branchB we just checked out.
git merge -s ours branchA
# Set branchA to current commit and check it out.
git checkout -B branchA
Beachten Sie, dass der erste übergeordnete Merge-Commit nun derjenige von branchB
und nur der zweite ist von branchA
. Das ist es, was z.B. Gandalf458's Antwort tut.
Verwenden Sie nur den Inhalt von B und behalten Sie die korrekte Reihenfolge der Eltern bei.
Dies ist die echte "ihre Version für git merge -s ours
". Sie hat den gleichen Inhalt wie die vorherige Option (d. h. nur den von branchB
), aber die Reihenfolge der Eltern ist korrekt, d. h. der erste Elternteil stammt von branchA
und die zweite von branchB
.
git checkout branchA
# Do a merge commit. The content of this commit does not matter,
# so use a strategy that never fails.
# Note: This advances branchA.
git merge -s ours branchB
# Change working tree and index to desired content.
# --detach ensures branchB will not move when doing the reset in the next step.
git checkout --detach branchB
# Move HEAD to branchA without changing contents of working tree and index.
git reset --soft branchA
# 'attach' HEAD to branchA.
# This ensures branchA will move when doing 'commit --amend'.
git checkout branchA
# Change content of merge commit to current index (i.e. content of branchB).
git commit --amend -C HEAD
Das ist es, was Paul Pladijs' Antwort tut (ohne dass eine temporäre Verzweigung erforderlich ist).
Besondere Fälle
Wenn die Übergabe von branchB
ist ein Vorfahre von branchA
, git merge
funktioniert nicht (er beendet sich mit einer Meldung wie " Bereits auf dem neuesten Stand. ").
In diesem oder anderen ähnlichen/erweiterten Fällen kann der Low-Level-Befehl git commit-tree
verwendet werden können.
1 Stimmen
Siehe auch diese Antwort: stackoverflow.com/questions/928646/ - ist es trivial, das Beispiel so zu ändern, dass Version B anstelle von A verwendet wird.
13 Stimmen
Siehe Antwort SO git-Befehl, um einen Zweig wie einen anderen zu machen pour todo die derzeitigen Möglichkeiten, um simulieren.
git merge -s their
.6 Stimmen
Sie sind also nicht wirklich auf der Suche nach einem
git merge -s theirs
(das lässt sich leicht erreichen mitgit merge -s ours
und einem temporären Zweig), da unser -s die Änderungen des merge-from-Zweigs komplett ignoriert...51 Stimmen
@Torek - tun die Git-Entwickler realmente es finden dass offensiv zu bieten
theirs
zusätzlich zuours
??? Dies ist ein Symptom für eines der größten technischen und gestalterischen Probleme von Git: Inkonsistenz.9 Stimmen
@jww Das Problem hier ist nicht, dass "git merge -s ours" beleidigend ist, sondern dass es kontraintuitiv ist. Aus der Frage des Auftraggebers geht hervor, dass er eine solche Funktion versehentlich verwenden würde, wenn er eigentlich "git merge -s recursive -X theirs" machen wollte. Es ist üblich, einen anderen Zweig zusammenzuführen, um Konflikte mit der Version auf dem anderen Zweig zu umgehen, aber den aktuellen Zweig komplett mit einem anderen Zweig zu überschreiben, der die Änderungen des aktuellen Zweigs komplett verwirft, ist wirklich ein Ausnahmefall.
5 Stimmen
Jeder sollte das "Update" des Auftraggebers sorgfältig prüfen, denn die Frage hat nichts zu tun mit
git merge -s ours
.0 Stimmen
Siehe auch: Git-Zusammenführungsstrategien
2 Stimmen
Fazit: Es ist
git merge -X theirs
3 Stimmen
git merge -X theirs Das funktioniert nicht, wenn Sie Hunderte von gelöschten Dateien in einem anderen Zweig zusammenführen wollen.
2 Stimmen
@Z.Khullah Bitte stürzen Sie die Leute nicht in schnelle Missverständnisse, die akzeptierte Antwort ist gefährlich, da sie zu beantworten scheint, was OP gesucht aber nicht, was seine Frage (Titel) fragt tatsächlich . Viele Antworten hier sind es wert, gelesen zu werden, um ein umfassendes Verständnis dieses heiklen Punktes in Git zu erlangen.
0 Stimmen
Ich empfehle dringend @tshepang Antwort unten stackoverflow.com/a/18682314/1375031 . Das ist meiner Meinung nach die einfachste und korrekteste Lösung. Sie hat mein ähnliches Problem effizient gelöst. Merge master auf deinen Zweig mit
-s ours
bevor Sie Ihren Zweig auf Master zusammenführen. Erwägen Sie vielleicht, die akzeptierte Antwort zu ändern, da einige Leute sie für ungenau halten.