2017-01-10 6 views
0

Hier ist mein Szenario. Ich arbeite gegen Zweig A. Ich habe einen Feature-Zweig lokal von Zweig B in Zweig A zusammengeführt. Danach habe ich ein paar Änderungen am Zweig A gemacht und ein Commit Y gemacht. Ich bemerkte, dass die Zusammenführung Probleme verursachte und ich muss mache diese Zusammenführung rückgängig und belasse nur das Y-Commit. Ich habe nicht von lokalen zu entfernten Zweig geschoben. Alle Änderungen betreffen die ausgehenden Commits. Wie kann ich das tun, ohne die Arbeit am Commit Y zu verlieren, sondern nur diese zu schieben? dankEntfernen Sie bestimmte lokale Commits mit Git

BTW: Ich bin mit Source-Tree (ich weiß, vielleicht wird dies eine Befehlszeile, aber wenn jemand weiß, wie man das Quellbaum verwenden, das wäre genial)

Antwort

2

Solange nichts verpflichten Y steht in direktem Konflikt mit den zusammengeführten Änderungen von Zweig B. Sie sollten in der Lage sein, eine interaktive Rebase auszuführen und den Zusammenführungs-Commit abzubrechen. Ich bin nicht vertraut mit Source-Tree, so kann ich Terminal-Befehle zur Verfügung stellen:

(von Zweig A): git rebase -i HEAD~3 (willkürlichen 3, Sie müssen nur ein paar Commits sehen)

die Zusammenführung finden begehen, und Im Anschluss an die interaktive Rebase-Anleitung können Sie das Wort in drop ändern. Speichern und beenden, und Git wiederholt die Commits, überspringt jedoch das Commit, das Sie zum Löschen festgelegt haben.

Hinweis: Wenn Sie sich unwohl fühlen, wenn Sie Arbeit verlieren, schlage ich vor, dass Sie zu Ihrem Remote-Repo schieben, dann versuchen Sie die interaktive Rebase. Wenn es so funktioniert, wie Sie es möchten, dann erzwingen Sie die Aktualisierung Ihres Repos, und wenn es nicht wie erwartet funktioniert, haben Sie das Backup, von dem Sie abholen können.

Hoffe, das hilft!

+0

Dies ist die richtige Antwort (benutze 'git rebase -i'), aber du musst das Merge-Commit nicht explizit löschen, da' git rebase -i' es für dich tun wird: Der Standardwert für rebase ist zu verwerfen verschmilzt. Die Verwendung von 'git rebase -p' versucht, Merges beizubehalten (es muss sie * neu erstellen, was einige kleinere Gefahren mit sich bringt), aber es ist generell unklug, das mit 'git rebase -i' zu kombinieren. – torek

+0

Ich werde dies als einen separaten Kommentar einfügen, da es eine separate Idee ist: Anstatt zu einem anderen Repository zu gehen, ist es einfacher, einen neuen Zweignamen zu erstellen, um die aktuelle Commit-Kette zu erhalten. Führen Sie einfach 'git branch saveme' aus, bevor Sie Ihre' git rebase -i' starten. Wenn Ihre Nachzahlung abgeschlossen ist, wird der Zweig "Saveme" Ihre ursprünglichen (Pre-Rebase) Commits haben, und Ihre aktuelle Filiale wird Ihre neuen (Post-Rebase) Kopien haben. Wenn alles gut ist, kannst du dann 'Gespeicherte Datei ablegen- um die gespeicherten Originale zu werfen. (In der Tat, Rebase speichert Ihre Originale für Sie unter dem speziellen Namen 'ORIG_HEAD'.) – torek

Verwandte Themen