Angenommen, Ihre Git-Geschichte sieht folgendermaßen aus:
1 2 3 4 5
1–5 sind separate Revisionen. Sie müssen 3 entfernen, während Sie 1, 2, 4 und 5 behalten. Wie geht das?
Gibt es eine effiziente Methode, wenn nach der zu löschenden Version Hunderte von Revisionen vorliegen?
git rebase --onto 2 3 HEAD
bedeutet so ziemlich Rebase auf 2, mit Commits zwischen 3 und HEAD (HEAD ist optional oder 5 in diesem Fall)Antworten:
Um Revision 3 und 4 zu einer einzigen Revision zu kombinieren, können Sie Git Rebase verwenden. Wenn Sie die Änderungen in Revision 3 entfernen möchten, müssen Sie den Befehl edit im interaktiven Rebase-Modus verwenden. Wenn Sie die Änderungen in einer einzigen Revision kombinieren möchten, verwenden Sie Squash.
Ich habe diese Squash-Technik erfolgreich angewendet, musste aber noch nie eine Revision entfernen. Die git-rebase-Dokumentation unter "Splitting Commits" sollte Ihnen hoffentlich genug Ideen geben, um es herauszufinden. (Oder jemand anderes könnte es wissen).
Aus der Git-Dokumentation :
quelle
Gemäß diesem Kommentar (und ich habe überprüft, ob dies wahr ist) ist Rados Antwort sehr nah, lässt Git jedoch in einem Zustand mit losgelöstem Kopf zurück. Entfernen Sie stattdessen Folgendes
HEAD
, um es<commit-id>
aus dem Zweig zu entfernen, in dem Sie sich befinden:quelle
^
,~1
damit es funktioniert.--strategy-option theirs
am Ende erneut ausführen müssen .Hier ist eine Möglichkeit, eine bestimmte nicht interaktiv zu entfernen
<commit-id>
, wobei Sie nur die wissen, die<commit-id>
Sie entfernen möchten:quelle
HEAD
, um einen abgetrennten Kopf zu vermeiden.Wie bereits erwähnt, ist git-rebase (1) dein Freund. Angenommen, die Commits befinden sich in Ihrer
master
Niederlassung, würden Sie Folgendes tun:Vor:
Nach dem:
Aus Git-Rebase (1):
quelle
--onto master~3 master~1
?MERGE CONFLICT
Fehler. Ich habe das unter stackoverflow.com/questions/2938301/remove-specific-commit erwähnte Szenario verwendet und kann das zweite Commit in diesem Beispiel nicht entfernen.Wenn Sie nur die in Revision 3 vorgenommenen Änderungen entfernen möchten, können Sie git revert verwenden.
Git Revert erstellt einfach eine neue Revision mit Änderungen, die alle Änderungen in der Revision, die Sie zurücksetzen, rückgängig machen.
Dies bedeutet, dass Sie Informationen sowohl über das unerwünschte Festschreiben als auch über das Festschreiben behalten, mit dem diese Änderungen entfernt werden.
Dies ist wahrscheinlich viel freundlicher, wenn es überhaupt möglich ist, dass jemand in der Zwischenzeit aus Ihrem Repository gezogen hat, da das Zurücksetzen im Grunde nur ein Standard-Commit ist.
quelle
Alle bisherigen Antworten sprechen nicht das nachfolgende Problem an:
Die Schritte folgen, aber als Referenz nehmen wir den folgenden Verlauf an:
C : Festschreiben direkt nach dem zu entfernenden Festschreiben (sauber)
R : Das zu entfernende Commit
B : Festschreiben unmittelbar vor dem zu entfernenden Festschreiben (Basis)
Aufgrund der Einschränkung "Hunderte von Revisionen" gehe ich von folgenden Voraussetzungen aus:
Dies ist eine ziemlich restriktive Reihe von Einschränkungen, aber es gibt eine interessante Antwort, die in diesem Eckfall tatsächlich funktioniert.
Hier sind die Schritte:
git branch base B
git branch remove-me R
git branch save
git rebase --preserve-merges --onto base remove-me
Wenn es wirklich keine Konflikte gibt, sollte dies ohne weitere Unterbrechungen erfolgen. Wenn es Konflikte gibt, können Sie diese lösen und /
rebase --continue
oder sich entscheiden, nur mit der Verlegenheit und zu lebenrebase --abort
.Jetzt sollten Sie darauf sein,
master
dass kein Commit R mehr darin enthalten ist . Dersave
Zweig zeigt auf Ihre vorherige Position, falls Sie eine Abstimmung durchführen möchten.Wie Sie die Übertragung aller anderen auf Ihre neue Historie arrangieren möchten, liegt bei Ihnen. Sie müssen mit vertraut sein
stash
,reset --hard
undcherry-pick
. Und Sie können die löschenbase
,remove-me
undsave
Zweigequelle
Ich bin auch in einer ähnlichen Situation gelandet. Verwenden Sie die interaktive Rebase mit dem folgenden Befehl und lassen Sie bei Auswahl das dritte Commit fallen.
quelle
Hier ist das Szenario, mit dem ich konfrontiert war, und wie ich es gelöst habe.
Hier
R
ist das Commit, das ich entfernen musste, und esI
ist ein einzelnes Commit, das danach kommtR
Ich habe ein Revert Commit gemacht und sie zusammengedrückt
Während des interaktiven Rebase-Squashs werden die letzten 2 Commits ausgeführt.
quelle
Die Antworten von Rado und Kareem tun nichts für mich (nur die Meldung "Aktueller Zweig ist aktuell." Wird angezeigt). Möglicherweise geschieht dies, weil das Symbol '^' in der Windows-Konsole nicht funktioniert. Nach diesem Kommentar löst das Ersetzen von '^' durch '~ 1' das Problem.
quelle