Ich begann die Arbeit an der Master-Verzweigung. Vor fast einem Jahr habe ich einen anderen Zweig dev erstellt, in dem ich einige Änderungen vorgenommen habe. Von da an arbeitete ich weiter an der Dev-Branche. Jetzt möchte ich Dev in Master zusammenführen, was zu vielen Konflikten führt. Ich möchte dev in den Master überführen, indem ich den Inhalt des Master-Zweiges überschreibe, d. H. Für jeden Konflikt, der entsteht, möchte ich die Version des Codes von dev branch behalten. Wie kann es gemacht werden?git Wie man eine Verzweigung in die Master-Verzweigung durch vollständiges Überschreiben der Master-Verzweigung einfügt
Antwort
Sie wollen verwenden ein „verschmelzen ihre Verwendung“ Strategie, die die X-Flag gesetzt ist mit
git checkout master
git merge -X theirs dev
Sie the strategy option mit -X
Schalter angeben:
git checkout master
git merge -X theirs dev
Ein bisschen Erläuterung. Die -X theirs
bedeutet: Verwenden Sie rekursive Strategie mit der Zusammenführung, aber Fallback zu ihre Änderungen, wenn die Strategie nicht den Konflikt lösen kann.
Dies unterscheidet sich von -s ours
(aus irgendeinem Grund gibt es keine -s theirs
), die eine gierige nehmen uns immer Lösung von Konflikten sein würde.
git-merge(1)
Merge Strategies Abschnitt bietet eine tiefergehende Erklärung zu diesem Thema.
Sie einen Push in Master
zwingen kanngit push -f origin master
Als Paulo Bu noted stellt git verschiedene Methoden für diese Option, wenn Sie eine Zusammenführung mit einem „ours“ Ansatz wollen, aber nur ein „aus der mit allen Commits "wenn Sie eine Zusammenführung mit einem" ihrer "Ansatz wünschen. Es lohnt sich, welche die beiden mit gutem Beispiel:
$ git merge -s ours deadbranch # merge deadbranch and ignore all its code
oder:
$ git merge -X ours livebranch # merge livebranch but use ours when conflicting
Lassen Sie mich auch hier beachten Sie, dass, wenn Sie git merge
verwenden, git zuerst die „Merge Basis“ findet, den Punkt, an dem die beiden synchron Zweige wurden zuletzt:
o - X <-- master
/
o - o - B
\
o - Y <-- otherbranch
B
Hier repräsentiert die commit, dass die merge-Base ist, X
die Spitze der Verzweigung (master
) und Y
ist die Spitze des anderen Zweiges. Was git tun wird, ist diff B
vs X
und B
vs Y
.
ist, dass wir an, in "unserem" Zweig, master
, haben wir Dateien unchanged
, no-conflicts
, und removed
. Diese Namen beziehen sich auf das, was in den anderen beiden Zweigen passiert ist.
Datei unchanged
ist unverändert in dem zu-fusionierte Zweig (das heißt, der Unterschied B
-Y
zeigt nichts für Datei unchanged
). git merge
berührt es nie, so ändert sich nichts, egal welche Argumente wir git merge
geben.
Die anderen Dateien haben einige Änderungen in master
und/oder den anderen Zweig.
Datei no-conflicts
hat eine Änderung in master
an der Spitze, und eine Änderung in der anderen Verzweigung an der Unterseite. Diese beiden Änderungen stehen nicht in Konflikt. git merge -s recursive
wird die Änderungen kombinieren, unabhängig davon, ob Sie die Option -X ours
verwenden. git merge -s ours
wird jedoch ihre Änderung verwerfen und dabei unsere Version der Datei no-conflicts
beibehalten. Für Fall ist das Ergebnis anders.
Datei hat eine Änderung im Master am Anfang der Datei und eine andere Änderung im anderen Zweig auch an der Spitze. (Die Änderungen können überall sein, sie müssen sich nur überlappen. "An der Spitze" lässt es sich überlappen.) Das bedeutet, dass diese Änderungen miteinander kollidieren. Mit git merge -s recursive
erhalten Sie eine Beschwerde und müssen den Konflikt lösen. Fügen Sie -X ours
hinzu und git nimmt Ihre Änderung und wirft ihre Änderung weg. Unter Verwendung von git merge -s ours
wird git Ihre Änderung übernehmen und ihre Änderung wegwerfen - so für Fall das Ergebnis ist das gleiche.
Datei removed
hat keine Änderung in master
, ist aber in der anderen Branche entfernt. In diesem Fall wird git merge -s recursive
die Datei entfernen, unabhängig davon, ob Sie -X ours
verwenden oder nicht. git merge -s ours
ignoriert jedoch die Entfernung.
Kurz gesagt, der Unterschied zwischen -s ours
und -s recursive -X ours
besteht darin, dass mit dem früheren, Git vollständig ignoriert die diff B
-Y
; Mit letzterem versucht git, die Diffs B
-to-X
(ours) und B
-to-Y
(theirs) zu kombinieren, aber im Falle eines Konflikts während der Kombination, wählt es die B
-to-X
Änderung.
Mit -X theirs
(das ist wirklich -s recursive -X theirs
), git Versuche, die Differentiale zu kombinieren, und im Falle von Konflikten, wählt die B
-zu-- Y
Veränderung gegenüber dem B
-zu-- X
ändern.
Es ist möglich, das Äquivalent von -s theirs
obwohl git zu erreichen ist dies nicht gebaut haben. Um dies zu tun, verwenden Sie git merge --no-commit otherbranch
, dann git rm -rf .
von der obersten Ebene des resultierenden merge zu entfernen (mit oder ohne Konflikte) , dann git checkout otherbranch -- .
von der obersten Ebene, um die Baumstruktur und den Index basierend auf otherbranch
erneut aufzufüllen. Dann einfach git commit
das Ergebnis. Es ist ziemlich selten, dies zu wollen, weshalb git es nicht als eingebaute Strategie hat.
Was ist -X hier? –
@hrehman die Strategieoption. Fügte einen Link für weitere Referenz hinzu. –
Sei vorsichtig hier, '-X unser' oder' -X ihr' ist ganz anders als '-s unseres'. Es gibt kein '-s ihr'. Es klingt wie '-X ihr' ist, was das OP will, also glaube ich, dass das die richtige Antwort ist (und es upvoting). – torek