Ich habe einen Zweig namens, demo
den ich mit dem master
Zweig zusammenführen muss. Ich kann das gewünschte Ergebnis mit folgenden Befehlen erhalten:
git pull origin demo
git checkout master
git pull origin master
git merge demo
git push origin master
Meine einzige Sorge ist, wenn es irgendwelche merge Fragen , die ich erzählen möchte git
zu überschreiben Änderungen in master
Zweig ohne mir prompt fusionieren. Grundsätzlich sollten Änderungen in der demo
Verzweigung Änderungen in der Verzweigung automatisch überschreiben master
.
Ich habe mich umgesehen, es gibt mehrere Möglichkeiten, aber ich möchte kein Risiko beim Zusammenführen eingehen.
git push -f origin master
-f
Option mitmerge
Befehl und nicht mitpush
Befehl verwendenAntworten:
Nicht wirklich mit dieser Antwort verbunden, aber ich würde Graben
git pull
, die nur läuft,git fetch
gefolgt vongit merge
. Sie führen drei Zusammenführungen durch, wodurch Ihr Git drei Abrufvorgänge ausführt, wenn nur ein Abruf erforderlich ist. Daher:Kontrolle der schwierigsten Zusammenführung
Der interessanteste Teil hier ist
git merge -X theirs
. Wie root545 feststellte , werden die-X
Optionen an die Zusammenführungsstrategie weitergegeben, und sowohl die Standardstrategierecursive
als auch die alternativeresolve
Strategie nehmen-X ours
oder-X theirs
(die eine oder andere, aber nicht beide). Um zu verstehen, was sie tun, müssen Sie jedoch wissen, wie Git Konflikte zusammenführt und behandelt .Ein Zusammenführungskonflikt kann in einigen Dateien 1 auftreten, wenn sich die Basisversion sowohl von der aktuellen (auch als lokale, HEAD- oder
--ours
) Version als auch von der anderen (auch als Remote- oder--theirs
) Version derselben Datei bezeichnet wird, unterscheidet. Das heißt, bei der Zusammenführung wurden drei Revisionen (drei Commits) identifiziert: Base, unsere und ihre. Die "Basis" -Version stammt aus der Zusammenführungsbasis zwischen unserem Commit und ihrem Commit, wie im Commit-Diagramm angegeben (mehr dazu in anderen StackOverflow-Postings). Git hat dann zwei Arten von Änderungen gefunden: "Was wir getan haben" und "Was sie getan haben". Diese Änderungen werden (im Allgemeinen) zeilenweise rein textuell gefundenBasis. Git hat kein wirkliches Verständnis für Dateiinhalte; es wird lediglich jede Textzeile verglichen.Diese Änderungen werden in der
git diff
Ausgabe angezeigt und haben wie immer auch einen Kontext . Es ist möglich, dass Dinge, die wir geändert haben, in anderen Zeilen stehen als Dinge, die sie geändert haben, so dass die Änderungen so aussehen, als würden sie nicht kollidieren, aber der Kontext hat sich auch geändert (z. B. weil sich unsere Änderung am oberen oder unteren Rand der Datei befindet). Damit die Datei in unserer Version ausgeht, haben sie in ihrer Version auch oben oder unten mehr Text hinzugefügt.Wenn die Änderungen in verschiedenen Zeilen erfolgen - zum Beispiel
color
incolour
Zeile 17 undfred
inbarney
Zeile 71 -, besteht kein Konflikt: Git übernimmt einfach beide Änderungen. Wenn die Änderungen in denselben Zeilen erfolgen, aber identische Änderungen sind, nimmt Git eine Kopie der Änderung. Nur wenn sich die Änderungen in derselben Zeile befinden, es sich jedoch um unterschiedliche Änderungen handelt oder wenn es sich um einen speziellen Fall eines störenden Kontexts handelt, wird ein Änderungs- / Änderungskonflikt angezeigt.Die Optionen
-X ours
und-X theirs
teilen Git mit, wie dieser Konflikt gelöst werden kann, indem nur eine der beiden Änderungen ausgewählt wird: unsere oder ihre. Da Sie sagten, Sie verschmelzendemo
(ihre) mitmaster
(unseren) und möchten die Änderungen vondemo
, möchten Sie-X theirs
.Das blinde Auftragen
-X
ist jedoch gefährlich. Nur weil unsere Änderungen nicht zeilenweise in Konflikt standen, heißt das nicht, dass unsere Änderungen nicht tatsächlich in Konflikt stehen! Ein klassisches Beispiel sind Sprachen mit Variablendeklarationen. Die Basisversion deklariert möglicherweise eine nicht verwendete Variable:In unserer Version löschen wir die nicht verwendete Variable, damit eine Compiler-Warnung verschwindet. In ihrer Version fügen sie einige Zeilen später eine Schleife hinzu und verwenden sie
i
als Schleifenzähler. Wenn wir die beiden Änderungen kombinieren, wird der resultierende Code nicht mehr kompiliert. Die-X
Option ist hier keine Hilfe, da sich die Änderungen in verschiedenen Zeilen befinden .Wenn Sie über eine automatisierte Testsuite verfügen, müssen Sie die Tests nach dem Zusammenführen am wichtigsten ausführen. Sie können dies nach dem Festschreiben tun und die Probleme später bei Bedarf beheben. oder Sie können dies vor dem Festschreiben tun , indem Sie
--no-commit
demgit merge
Befehl hinzufügen . Wir werden die Details für all dies anderen Postings überlassen.1 Sie können auch Konflikte in Bezug auf "dateiweite" Operationen bekommen, z. B. korrigieren wir möglicherweise die Schreibweise eines Wortes in einer Datei (damit wir eine Änderung haben) und sie löschen die gesamte Datei (so dass sie eine haben) löschen). Git wird diese Konflikte unabhängig von den
-X
Argumenten nicht alleine lösen .Weniger Zusammenführungen und / oder intelligentere Zusammenführungen durchführen und / oder Rebase verwenden
In unseren beiden Befehlssequenzen gibt es drei Zusammenführungen. Das erste ist,
origin/demo
in die lokale zu bringendemo
(Ihre Verwendungen,git pull
die, wenn Ihr Git sehr alt ist, nicht aktualisiertorigin/demo
werden können, aber das gleiche Endergebnis erzeugen). Das zweite ist , zu bringenorigin/master
inmaster
.Mir ist nicht klar, wer aktualisiert
demo
und / odermaster
. Wenn Sie Ihren eigenen Code in Ihren eigenendemo
Zweig schreiben und andere Code schreiben und in dendemo
Zweig verschiebenorigin
, kann diese Zusammenführung im ersten Schritt zu Konflikten führen oder eine echte Zusammenführung bewirken. Meistens ist es besser, Rebase zu verwenden, als zusammenzuführen, um Arbeit zu kombinieren (zugegebenermaßen ist dies eine Frage des Geschmacks und der Meinung). In diesem Fall möchten Sie möglicherweisegit rebase
stattdessen verwenden. Auf der anderen Seite, wenn Sie noch nie auf einem Ihren eigenen Commits tundemo
, tun Sie nicht einmal brauchen einendemo
Zweig. Wenn Sie alternativ viel davon automatisieren möchten, aber sorgfältig prüfen können, ob Commits vorliegen, die sowohl Sie als auch andere vorgenommen haben, möchten Sie diese möglicherweise verwendengit merge --ff-only origin/demo
: Dies spult Sie schnell vordemo
, um mit den aktualisiertenorigin/demo
Daten übereinzustimmen, wenn dies möglich ist, und schlägt einfach fehl, wenn nicht (an diesem Punkt können Sie die beiden Änderungssätze überprüfen und je nach Bedarf eine echte Zusammenführung oder eine Neuausrichtung auswählen).Die gleiche Logik gilt für
master
, obwohl Sie den merge tun aufmaster
, so dass Sie auf jeden Fall ein brauchenmaster
. Es ist jedoch noch wahrscheinlicher, dass die Zusammenführung fehlschlagen soll, wenn sie nicht als Nicht-Zusammenführung im Schnellvorlauf durchgeführt werden kanngit merge --ff-only origin/master
. Dies sollte also wahrscheinlich auch so sein .Nehmen wir an, Sie machen niemals Ihre eigenen Verpflichtungen
demo
. In diesem Fall können wir den Namendemo
ganz fallen lassen:Wenn Sie sich Ihr eigenes tun
demo
Zweig Commits, ist dies nicht hilfreich; Sie können die vorhandene Zusammenführung auch--ff-only
beibehalten (aber je nach gewünschtem Verhalten hinzufügen ) oder auf eine Neueinstellung umstellen. Beachten Sie, dass alle drei Methoden möglicherweise fehlschlagen: Das Zusammenführen kann mit einem Konflikt fehlschlagen, das Zusammenführen mit--ff-only
kann möglicherweise nicht schnell vorgespult werden, und das erneute Basieren kann mit einem Konflikt fehlschlagen (das erneute Basieren funktioniert im Wesentlichen durch Cherry-Picking- Commits, bei denen das Zusammenführen verwendet wird Maschinen und können daher einen Zusammenführungskonflikt bekommen).quelle
Ich hatte ein ähnliches Problem, bei dem ich alle Dateien, die Änderungen / Konflikte mit einem anderen Zweig hatten, effektiv ersetzen musste.
Die Lösung, die ich fand, war zu verwenden
git merge -s ours branch
.Beachten Sie, dass die Option ist
-s
und nicht-X
.-s
bezeichnet die Verwendungours
als Zusammenführungsstrategie der obersten Ebene,-X
würde dieours
Option auf dierecursive
Zusammenführungsstrategie anwenden , was in diesem Fall nicht das ist, was ich (oder wir) wollen.Schritte, wo
oldbranch
ist der Zweig, mit dem Sie überschreiben möchtennewbranch
.git checkout newbranch
checkt den Zweig aus, den Sie behalten möchtengit merge -s ours oldbranch
wird im alten Zweig zusammengeführt, behält jedoch alle unsere Dateien bei.git checkout oldbranch
checkt den Zweig aus, den Sie überschreiben möchtenget merge newbranch
wird in der neuen Niederlassung zusammengeführt und überschreibt die alte Niederlassungquelle
Dieser Zusammenführungsansatz fügt ein Commit hinzu, auf
master
das in was auch immer eingefügt wirdfeature
, ohne sich über Konflikte oder anderen Mist zu beschweren.Bevor Sie etwas berühren
Nun bereite den Meister vor
Lassen Sie sich
feature
alle gekleidetMach den Kill
quelle
Changes from the other tree that do not conflict with our side are reflected in the merge result
. Es hat bei mir nicht funktioniert, da ich Commits in meiner Filiale, die überschrieben wurden, sauber zusammengeführt hatte. Gibt es einen anderen Weg?Sie können "unsere" Option in Git Merge versuchen,
quelle
demo
Version bevorzugt wird, obwohl er sich zusammenschließtmaster
. Es gibt-X theirs
auch, aber es ist nicht klar, dass dies das ist, was das OP wirklich will.ours
bei der Verwendung im Backend mit der-s
Option geschieht . Bei Verwendungours
mit-X
: Es verwirft alles, was der andere Baum getan hat, und erklärt, dass unser Verlauf alles enthält, was darin passiert ist. QuelleAls ich versuchte,
-X theirs
andere verwandte Befehlsschalter zu verwenden, bekam ich immer wieder ein Merge-Commit. Ich habe es wahrscheinlich nicht richtig verstanden. Eine leicht verständliche Alternative besteht darin, den Zweig zu löschen und ihn dann erneut zu verfolgen.Dies ist nicht gerade eine "Zusammenführung", aber das ist es, wonach ich gesucht habe, als ich auf diese Frage gestoßen bin. In meinem Fall wollte ich Änderungen von einem entfernten Zweig abrufen, die zwangsweise gedrückt wurden.
quelle