2014-07-23 13 views
6

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

5

Sie wollen verwenden ein „verschmelzen ihre Verwendung“ Strategie, die die X-Flag gesetzt ist mit

git checkout master 
git merge -X theirs dev 
5

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.

+0

Was ist -X hier? –

+0

@hrehman die Strategieoption. Fügte einen Link für weitere Referenz hinzu. –

+0

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

2

Sie einen Push in Master

zwingen kann
git push -f origin master 
1

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.

Verwandte Themen