2017-07-25 3 views
0

Ich habe ein Git-Projekt und die stabile Version wurde immer in Master-Zweig gespeichert. Für eine Weile arbeitete ich an Version 2.0 in einem separaten Zweig v20.git kopieren Zweig Inhalt zu Master

Jetzt habe ich beschlossen, es zu veröffentlichen und kopieren Sie alles wieder zu Master-Zweig. Ich möchte es nicht zusammenführen, da es Hunderte von widersprüchlichen Änderungen gab und viele Dateien manuelle Eingriffe erforderlich machen.

Alles, was ich will, nur um einen Snapshot von v20 Zweig zu machen und es zu Master ohne Auswirkungen auf die alte Geschichte, ohne Rebase (so andere Benutzer werden nicht so gut beeinflusst). Um es so aussehen zu lassen, gab es nur ein neues Commit, das alle Änderungen mit sich bringt.

Start-Zustand:

master branch --------- v20 branch 
     |      | 
master files --------- v20 files 
     |      | 
master_history   v20_history 

Zielzustand:

master branch --------- v20 branch 
     |      | 
    v20 files -------- v20 files 
     |      | 
master_history   v20_history 
+ commit from v20 

Gibt es einen bestehenden git Weg, dies zu tun?

+0

@DaveNewton du meinst '-s rekursiv -X ihr's? Es funktioniert nicht so. Es bleibt immer noch eine Menge ungelöster Konflikte, die manuelle Eingriffe erfordern. Es ist keine Kopie. Ich brauche genau den Zustand meines Zweiges aber im Master. – rush

+3

Was ist mit (während Sie in V20 sind) 'merge -s unser Master' (nicht' -s rekursiv -X unser'), dann, v20 in Master zusammenführen? – mayo

Antwort

3

Sie beschreiben das Ergebnis von git merge -s theirs, which does not exist, and one of the main Git authors insists that it should not exist:. Zitiert aus diesem Link (diese sind nicht meine Worte):

Heh, jetzt einige Lesungen zu tun haben ;-)

ich nicht klingen zu negativ, wenn andere -Xours und -Xtheirs es beschreiben, aber eigentlich denke ich "-s ihr" ist noch schlimmer. Es ist, wie Sie würde verwerfen, was Sie getan haben (vielleicht weil die andere Seite viel besser Lösung als der Hack hat), aber das kann viel leichter und sauberer erfolgen mit:

$ git reset --hard origin 

Einige Leute könnten sagen "Aber mit 'merge -s theirs' kann ich behalten, was ich tat, auch". Dieser Reset ist einfach das, was ich getan habe.

Diese Logik ist auch fehlerhaft. Sie können stattdessen:

$ git branch i-was-stupid 
$ git reset --hard origin 

, wenn Sie wirklich über Ihren Fehler aufzeichnen wollen.

Ein großes Problem „sich ihre“ hat, im Vergleich zu dem oben „zurückgesetzt Herkunft, Wegwerfen oder die ausgefallenen Geschichte beiseite“ sind, dass Ihre ‚Master‘ Geschichte, die Ihre Weiterentwicklung auf halten basiert Ihre gescheitert Mist in es für immer, wenn Sie "-s ihre" getan haben. Hoffentlich werden Sie im Laufe der Zeit ein besserer Programmierer werden, und Sie können schließlich etwas haben, das wert ist, mit der Welt nahe der Spitze Ihres Vorlagenzweigs zu teilen. Wenn das passiert, können Sie jedoch nicht bieten Ihren Master-Zweig von der Upstream gezogen werden, wie die weitere Welt wird nicht in Ihre früheren Fehler überhaupt interessiert sein.

Sie können mit den Git Leute fühlen sich frei, anderer Meinung zu sein und gehen auf und einige der Antworten auf Is there a "theirs" version of "git merge -s ours"? Hinweis zu verwenden, dass die akzeptierte Antwort nicht wirklich ein -s theirs überhaupt ist.Michael R's answer, mit git read-tree, um den Index während einer --no-commit Zusammenführung zu wechseln, ist richtig. Die Methode in mayo's comment ist auch gut, und jthill's answer zu der anderen SO Frage ist auch richtig

Ihr Fall unterscheidet sich ein wenig von dem oben beschriebenen, aber Sie können den "schlechten" Zweig einfach umbenennen und den "guten" Zweig in master umbenennen und von dort weitergehen. Jeder, der "downstream" von Ihnen kommt, wird die gleiche Umbenennung benötigen, also müssen Sie mehrere Punkte beachten.

Verwandte Themen