2016-03-20 5 views
2

Es ist einfach, ein Commit mit Git rückgängig zu machen.Abbrechen einer Zusammenführung (um später zusammenzuführen)

Aber was, wenn ich ein Commit von einer Zusammenführung rückgängig machen möchte, um es zu annullieren und es später zusammenzuführen?

master--\--------------/------revert-merge------/------------------ 
     \   /     /merge nothing     
      \--branch--/----no-modification-----/------  

Wenn ich fusionieren wieder nach einem ersten merge Git wird meine Änderungen nicht akzeptieren, weil ich schon vor und jemand verschmolzen (mir oder jemand anderes) diese Linie und Git zurück weiß nicht, warum.

Git sehen, ich habe bereits eine Zusammenführung dann zurückgesetzt es so, wenn ich die zweite Zusammenführung tun, weiß es nicht den Grund der Rückstellung und Git in Betracht ziehen, gibt es keine Änderung mehr.

Also eigentlich sollte ich keine einfache Rückstellung machen, wenn ich einen Commit abbrechen möchte. Was ist der korrekte Vorgang, um eine Zusammenführung abzubrechen/zu verschieben? Dies kann helfen, eine Menge https://www.git-scm.com/blog/2010/03/02/undoing-merges.html

+0

Einfach die Rückstellung wiederherstellen? – mkasberg

+0

Ja, eigentlich ist es das, was ich gemacht habe, aber wenn Sie mit einem Team und mehreren Zweigen arbeiten, ist es kompliziert sich daran zu erinnern, was Sie bei der nächsten Zusammenführung wiederherstellen müssen. Meine Probe hier ist sehr einfach. Wo Sie lesen können - keine Änderung - es ist in realen Projekten niemals richtig. Wenn Sie also die zweite Zusammenführung durchführen und vergessen, Ihre Zurücksetzung rückgängig zu machen, erstellen Sie natürlich Fehler. Dann versuchst du, dich nach der zweiten Zusammenführung zurückzusetzen und du beginnst zu weinen ... –

+0

Benutze git reflog, um zu dem Punkt zurück zu kommen, an dem du sein willst. – CodeWizard

Antwort

2

Es gibt einen großen Artikel von Linus (die Git schrieb) über dieses Szenario here.

Um es zusammenzufassen, es läuft darauf hinaus, zwei Optionen unten:

Option 1 einen schlechten merge Stellen, kehren die Zusammenführung, dann später, bevor die Verzweigung wieder, kehren die revert verschmelzen. Wenn Sie den Wiederherstellungsvorgang wiederherstellen, werden die fehlerhaften Änderungen rückgängig gemacht, und Sie beheben sie, indem Sie Ihren Zweig erneut zusammenführen. Die Nachteile dieser Methode sind, wie Sie bereits erwähnt haben, dass Sie die Zurücksetzung finden und daran denken müssen, sie wiederherzustellen, bevor Sie Ihren Zweig wieder zusammenführen.

---o---o---o---M---x---x---W---x---Y---* 
      /     /
     ---A---B-------------------C---D 

A und B sind schlechte Commits, M ist die Zusammenführung, W kehrt M zurück, Y kehrt zu W. zurück

Option 2 Führen Sie eine schlechte Zusammenführung durch, stellen Sie die Zusammenführung wieder her, und erstellen Sie dann eine völlig neue Verzweigung (durch Wiederholen oder Ändern der Änderungen). Der Nachteil dieser Option ist, dass Sie eine weitere separate Verzweigung vornehmen müssen. Aber der Vorteil ist, dass Sie sich nicht daran erinnern müssen, die Zurücksetzung rückgängig zu machen.

---o---o---o---M---x---x---W---x---x 
     /    \ 
    ---A---B     A'--B'--C' 

A und B sind schlecht Commits, M ist die Zusammenführung, kehrt W M.

Natürlich wahrscheinlich die beste Option zu vermeiden, ist Sachen in Master-Zusammenführung, die nicht bereit ist, zusammengeführt werden in Meister. Weil keine der Optionen für die Reinigung wirklich großartig ist.

0

Es ist einfach ein Commit mit Git zurückzukehren

. Aber was, wenn ich ein Commit von einem Merge rückgängig machen möchte, um es zu annullieren, um später zusammenzuführen?

Nur wenige Optionen:

git reflog

Zuerst git reflog verwenden - es ist alles über hier lesen:
How to move HEAD back to a previous location? (Detached head)


Zusammenführen ist eine Kombination aus mehreren Festschreibungen.
Jeder Commit heißt parent, daher hat Merge nur wenige Eltern (2 oder mehr).
Nehmen wir an, der einfache Fluss, wo Sie nur 2 Eltern haben.

Was Sie tun können, um es zu konvertieren ist einfach die gewünschte Elternteil mit einem revert Befehl zurückzukehren

# Add the -m to the revert to indicate that you are reverting a merge 
# (-m 1) - The number is the id of the parent (1-N) 
# SHA-1 - optional SHA-1 to revert 
git revert -m 1 SHA-1 
Verwandte Themen