Wenn git merge
ich den Themenzweig "B" mit "A" zusammenführe, treten Konflikte auf. Ich weiß, dass alle Konflikte mit der Version in "B" gelöst werden können.
Ich bin mir bewusst git merge -s ours
. Aber was ich will, ist so etwas wie git merge -s theirs
.
Warum existiert es nicht? Wie kann ich nach der widersprüchlichen Zusammenführung mit vorhandenen git
Befehlen das gleiche Ergebnis erzielen ? ( git checkout
jede nicht zusammengeführte Datei von B)
UPDATE: Die "Lösung", nur etwas aus Zweig A (dem Merge-Commit-Punkt zur B-Version des Baums) zu verwerfen, ist nicht das, wonach ich suche.
git merge -s their
.git merge -s theirs
(was mitgit merge -s ours
und einem temporären Zweig leicht zu erreichen ist ), da wir die Änderungen des Zusammenführungszweigs völlig ignorieren ...theirs
um zusätzlichours
??? Dies ist ein Symptom für eines der allgemeinen Engineering- und Designprobleme in Git: Inkonsistenz.Antworten:
Fügen Sie die
-X
Option hinzutheirs
. Zum Beispiel:Alles wird auf die gewünschte Weise zusammengeführt.
Ich habe nur Probleme gesehen, wenn Dateien aus branchB gelöscht wurden. Sie erscheinen als Konflikte, wenn etwas anderes als Git die Entfernung durchgeführt hat.
Die Lösung ist einfach. Führen Sie einfach
git rm
den Namen aller gelöschten Dateien aus:Danach
-X theirs
sollte das wie erwartet funktionieren.Das eigentliche Entfernen mit dem
git rm
Befehl verhindert natürlich, dass der Konflikt überhaupt erst auftritt.Hinweis : Es gibt auch eine längere Formularoption.
Um es zu verwenden, ersetzen Sie:
mit:
quelle
theirs
". -Xtheirs ist die Strategie Option auf rekursive angewendet Strategie . Dies bedeutet, dass die rekursive Strategie immer noch alles zusammenführt, was sie kann, und nur im Falle von Konflikten auf "ihre" Logik zurückgreift. Während dies in den meisten Fällen wie oben beschrieben ist, ist dies nicht dasselbe wie "Nehmen Sie einfach alles aus Zweig B wie es ist". Es führt stattdessen sowieso die eigentliche Zusammenführung durch.Eine mögliche und getestete Lösung zum Zusammenführen von branchB mit unserem ausgecheckten branchA:
Um es zu automatisieren, können Sie es mit branchA und branchB als Argumenten in ein Skript einbinden.
Diese Lösung behält das erste und zweite übergeordnete Element des Zusammenführungs-Commits bei, genau wie Sie es erwarten würden
git merge -s theirs branchB
.quelle
git reset --soft branchA
?git reset --hard
Änderungen, auf die festgeschrieben wird,branchA
darauf verweisen .In älteren Versionen von git konnten Sie die Zusammenführungsstrategie "ihrer" verwenden:
Dies wurde jedoch inzwischen entfernt, wie in dieser Nachricht von Junio Hamano (dem Git-Betreuer) erläutert . Wie im Link angegeben, würden Sie stattdessen Folgendes tun:
Beachten Sie jedoch, dass dies anders ist als eine tatsächliche Zusammenführung. Ihre Lösung ist wahrscheinlich die Option, nach der Sie wirklich suchen.
quelle
git reset --hard origin
eine Lösung für eine Zusammenführung ihres Stils? Wenn ich BranchB in BranchA zusammenführen wollte (wie in der Antwort von Alan W. Smith), wie würde ich das mit derreset
Methode machen?git reset --hard
eine Verschmelzung im "ihre" -Stil durchzuführen . Erstellt natürlichgit reset --hard
kein Merge-Commit oder Commit für diese Angelegenheit. Sein Punkt ist, dass wir keine Zusammenführung verwenden sollten , um irgendetwas in HEAD durch etwas anderes zu ersetzen. Ich stimme jedoch nicht unbedingt zu.theirs
entfernt wurde, weil die Begründung unvollständig war. Es hat nicht die Fälle berücksichtigt, in denen der Code gut ist. Es ist nur so, dass der Upstream auf einer anderen philosophischen Basis aufrechterhalten wird. In diesem Sinne ist er also "schlecht", also möchte man beide mit dem Upstream auf dem Laufenden bleiben, aber Gleichzeitig behalten Sie Ihre guten Code-Korrekturen bei [git & msysgit haben dies einige dieser "Konflikte" aufgrund der unterschiedlichen Philosophien ihrer Zielplattform]theirs
weil ich versehentlich einige Dateien in zwei separaten Zweigen geändert hatte und die Änderungen von einem verwerfen wollte, ohne dies für jede Datei manuell tun zu müssen.Es ist nicht ganz klar, was Ihr gewünschtes Ergebnis ist, daher gibt es einige Verwirrung über die "richtige" Vorgehensweise in den Antworten und ihren Kommentaren. Ich versuche einen Überblick zu geben und sehe die folgenden drei Optionen:
Versuchen Sie, B zusammenzuführen und B für Konflikte zu verwenden
Dies ist nicht die "ihre Version für
git merge -s ours
", sondern die "ihre Version fürgit merge -X ours
" (kurz fürgit merge -s recursive -X ours
):Dies ist, was zB die Antwort von Alan W. Smith tut.
Verwenden Sie nur Inhalte von B.
Dadurch wird ein Zusammenführungs-Commit für beide Zweige erstellt, alle Änderungen werden jedoch verworfen
branchA
und nur der Inhalt wird beibehaltenbranchB
.Beachten Sie, dass bei der Zusammenführung das erste übergeordnete Element jetzt das von
branchB
und nur das zweite von istbranchA
. Dies ist, was zB die Antwort von Gandalf458 tut.Verwenden Sie nur Inhalte von B und behalten Sie die korrekte übergeordnete Reihenfolge bei
Dies ist die echte "ihre Version für
git merge -s ours
". Es hat den gleichen Inhalt wie in der vorherigen Option (dh nur den vonbranchB
), aber die Reihenfolge der Eltern ist korrekt, dh der erste Elternteil kommt vonbranchA
und der zweite vonbranchB
.Dies ist die Antwort von Paul Pladijs (ohne dass eine vorübergehende Verzweigung erforderlich ist).
quelle
git checkout branchA; git merge -s ours --no-commit branchB; git read-tree -um @ branchB; git commit
read-tree
, an den der durchschnittliche Git-Benutzer möglicherweise nicht gewöhnt ist (zumindest bin ich das nicht ;-)). Die Lösungen in der Antwort verwenden nur die Befehle auf hoher Ebene ("Porzellan"), die die meisten Git-Benutzer kennen sollten. Ich bevorzuge sie, aber trotzdem danke für deine Version!…commit --amend…
) ausgeführt haben, "verloren". Ich plane, dieser Antwort einige grafische Erklärungen hinzuzufügen, sobald ich Zeit dazu habe… ;-)Ich habe seitdem die Antwort von Paul Pladijs verwendet. Ich habe herausgefunden, dass Sie eine "normale" Zusammenführung durchführen können, Konflikte auftreten, also tun Sie es
um den Konflikt mithilfe der Revision aus dem anderen Zweig zu lösen. Wenn Sie dies für jede Datei tun, haben Sie das gleiche Verhalten, das Sie erwarten würden
Auf jeden Fall ist der Aufwand größer als bei der Merge-Strategie! (Dies wurde mit Git Version 1.8.0 getestet)
quelle
git ls-files --modified | xargs git add
wollte ich dies tun, um auf beiden Seiten zusammenzuführen: /git ls-files --modified
daher denke ich, dass dies auch eine praktikable Lösung ist.git config --global alias.unresolved '!git status --short|egrep "^([DAU])\1"'
-X
und was ist der Unterschied zwischen-X
und-s
? kann kein Dokument finden.Ich habe mein Problem mit gelöst
quelle
Ich gehe davon aus, dass Sie einen Zweig von Master erstellt haben und nun wieder zu Master verschmelzen möchten, um alle alten Dinge in Master zu überschreiben. Genau das wollte ich tun, als ich auf diesen Beitrag stieß.
Tun Sie genau das, was Sie tun möchten, außer dass Sie zuerst den einen Zweig in den anderen zusammenführen. Ich habe das einfach gemacht und es hat großartig funktioniert.
Dann checkout master und füge deinen Zweig darin zusammen (es wird jetzt reibungslos gehen):
quelle
Wenn Sie sich in Zweig A befinden, tun Sie Folgendes:
Getestet auf Git Version 1.7.8
quelle
Um eine Zusammenführung wirklich richtig durchzuführen, die nur Eingaben von dem Zweig enthält, den Sie zusammenführen, können Sie dies tun
git merge --strategy=ours ref-to-be-merged
git diff --binary ref-to-be-merged | git apply --reverse --index
git commit --amend
In keinem mir bekannten Szenario gibt es Konflikte, Sie müssen keine zusätzlichen Zweige erstellen und es verhält sich wie ein normales Zusammenführungs-Commit.
Dies spielt jedoch mit Submodulen nicht gut.
quelle
Während ich in " git-Befehl zum Erstellen eines Zweigs wie eines anderen " erwähne, wie simuliert werden soll
git merge -s theirs
, ist zu beachten, dass Git 2.15 (Q4 2017) jetzt klarer ist:Siehe Commit c25d98b (25. September 2017) von Junio C Hamano (
gitster
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 4da3e23 , 28. September 2017)-Xtheirs
ist eine Strategieoption, die auf eine rekursive Strategie angewendet wird. Dies bedeutet, dass die rekursive Strategie immer noch alles zusammenführt, was sie kann, und nurtheirs
im Falle von Konflikten auf die Logik zurückgreift .Diese Debatte über die Relevanz oder Nicht-Relevanz einer
theirs
Fusionsstrategie wurde kürzlich in diesem Thread vom September 2017 zurückgebracht .Es erkennt ältere (2008) Threads an
Es erwähnt den Alias:
Jaroslaw Halchenko versucht erneut, sich für diese Strategie einzusetzen, aber Junio C. Hamano fügt hinzu :
Junio fügt hinzu, wie von Mike Beaton kommentiert :
quelle
git merge -s ours <their-ref>
Effektiv heißt es: "Markieren Sie Commits, die bis zu <Ihr-Ref> in ihrem Zweig erstellt wurden, als Commits, die dauerhaft ignoriert werden sollen." '; und dies ist wichtig, weil, wenn Sie später aus späteren Zuständen ihres Zweigs zusammenführen, ihre späteren Änderungen übernommen werden, ohne dass die ignorierten Änderungen jemals übernommen werden.Siehe Junio Hamanos häufig zitierte Antwort : Wenn Sie festgeschriebene Inhalte verwerfen möchten, verwerfen Sie einfach die Festschreibungen oder halten Sie sie auf jeden Fall aus der Hauptgeschichte heraus. Warum sollte man in Zukunft alle belästigen, Commit-Nachrichten von Commits zu lesen, die nichts zu bieten haben?
Aber manchmal gibt es administrative Anforderungen oder vielleicht einen anderen Grund. Für Situationen, in denen Sie wirklich Commits aufzeichnen müssen, die nichts beitragen, möchten Sie:
(edit: wow, habe ich es geschafft, das vorher falsch zu verstehen. Dieses funktioniert.)
quelle
Dieser verwendet einen Lesebaum für den Git-Installationsbefehl, sorgt jedoch für einen kürzeren Gesamtworkflow.
quelle
Dadurch wird Ihre neue Branche in der vorhandenen Basisbranche zusammengeführt
quelle
git commit --amend
, am Ende Ihres Beispiels etwas hinzuzufügen , oder Benutzer sehen möglicherweise das Zusammenführungs-Commit mitgit log
und gehen davon aus, dass der Vorgang abgeschlossen ist.Ich denke, was Sie eigentlich wollen, ist:
Das scheint ungeschickt, aber es sollte funktionieren. Der einzige Gedanke, den ich an dieser Lösung wirklich nicht mag, ist, dass der Git-Verlauf verwirrend sein wird ... Aber zumindest bleibt der Verlauf vollständig erhalten und Sie müssen für gelöschte Dateien nichts Besonderes tun.
quelle
Das Äquivalent (das die übergeordnete Reihenfolge beibehält) zu 'git merge -s itss branchB'
Vor dem Zusammenführen:
!!! Stellen Sie sicher, dass Sie in einem sauberen Zustand sind !!!
Führen Sie die Zusammenführung durch:
Was wir gemacht haben ? Wir haben ein neues Commit erstellt, das zwei Eltern von uns und von ihnen haben, und das Contnet des Commits ist branchB - von ihnen
Nach dem Zusammenführen:
Etwas präziser:
quelle
Diese Antwort wurde von Paul Pladijs gegeben. Ich habe nur seine Befehle angenommen und der Einfachheit halber einen Git-Alias erstellt.
Bearbeiten Sie Ihre .gitconfig und fügen Sie Folgendes hinzu:
Dann können Sie "git merge -s its A" ausführen, indem Sie Folgendes ausführen:
quelle
Ich musste dies erst kürzlich für zwei separate Repositorys tun, die einen gemeinsamen Verlauf haben. Ich begann mit:
Org/repository1 master
Org/repository2 master
Ich wollte, dass alle Änderungen von
repository2 master
angewendet werden,repository1 master
und akzeptierte alle Änderungen, die Repository2 vornehmen würde. In gits Worten sollte dies eine Strategie sein, die-s theirs
ABER nicht existiert. Seien Sie vorsichtig, denn der-X theirs
Name lautet so, wie Sie es möchten, aber er ist NICHT derselbe (auf der Manpage steht dies sogar).Ich habe das gelöst, indem
repository2
ich zu einem neuen Zweig gegangen binrepo1-merge
. In diesem Zweig bin ich gelaufengit pull [email protected]:Org/repository1 -s ours
und es geht ohne Probleme gut zusammen. Ich schiebe es dann auf die Fernbedienung.Dann gehe ich zurück zu
repository1
und mache einen neuen Zweigrepo2-merge
. In diesem Zweig führe ich aus,git pull [email protected]:Org/repository2 repo1-merge
was mit Problemen abgeschlossen wird.Schließlich müssten Sie entweder eine Zusammenführungsanforderung ausgeben
repository1
, um sie zum neuen Master zu machen, oder sie einfach als Zweig behalten.quelle
Eine einfache und intuitive (meiner Meinung nach) zweistufige Methode ist dies
gefolgt von
(was die beiden Zweige als zusammengeführt markiert)
Der einzige Nachteil ist, dass keine Dateien entfernt werden, die in Zweig B aus Ihrem aktuellen Zweig gelöscht wurden. Ein einfacher Unterschied zwischen den beiden Zweigen zeigt anschließend an, ob solche Dateien vorhanden sind.
Dieser Ansatz macht auch aus dem späteren Revisionsprotokoll deutlich, was getan wurde - und was beabsichtigt war.
quelle