Wie kann ich eine Reihe von Commits in Git zurücksetzen? In der Dokumentation zu gitrevisions kann ich nicht erkennen, wie der von mir benötigte Bereich angegeben werden soll. Beispielsweise:
A -> B -> C -> D -> E -> HEAD
Ich möchte das Äquivalent von tun:
git revert B-D
wo das Ergebnis wäre:
A -> B -> C -> D -> E -> F -> HEAD
wobei F die Umkehrung von BD einschließlich enthält.
Antworten:
Welche Version von Git verwenden Sie?
Das Zurücksetzen mehrerer Commits wird nur in Git1.7.2 + unterstützt: Weitere Informationen finden Sie unter " Rollback auf ein altes Commit durch mehrmaliges Zurücksetzen ".
Die aktuelle
git revert
Manpage ist nur für die aktuelle Git-Version (1.7.4+).Wie der OP Alex Spurling in den Kommentaren berichtet:
Ein Upgrade auf 1.7.4 funktioniert einwandfrei.
Um meine eigene Frage zu beantworten, ist dies die Syntax, nach der ich gesucht habe:
B^
bedeutet "das erste übergeordnete Commit von B": Dies ermöglicht die EinbeziehungB
in das Zurücksetzen.Siehe "
git rev-parse
Abschnitt SPEZIFIZIEREN VON REVISIONEN ", der<rev>^
z. B. dieHEAD^
Syntax enthält: Weitere Informationen finden Sie unter " Was bedeutet das^
Zeichen caret ( )? ")Beachten Sie, dass jedes zurückgesetzte Commit separat festgeschrieben wird.
Henrik N stellt in den Kommentaren klar :
Wie unten gezeigt, können Sie ohne sofortiges Festschreiben zurückkehren:
quelle
git revert OLDER_COMMIT^..NEWER_COMMIT
^
zu einem Revisionsparameter bedeutet das erste übergeordnete Element dieses Festschreibungsobjekts ."Wenn Sie den Commit-Bereich B in einem einzigen Commit auf D zurücksetzen möchten (zumindest in Git-Version 2), können Sie dies tun
Dadurch werden die durch Commits vorgenommenen Änderungen vom übergeordneten Commit von B (ausgeschlossen) zum Commit von D (enthalten) zurückgesetzt, es wird jedoch kein Commit mit den zurückgesetzten Änderungen erstellt. Durch das Zurücksetzen werden nur der Arbeitsbaum und der Index geändert.
Vergessen Sie nicht, die Änderungen danach zu übernehmen
Sie können mit derselben Methode auch mehrere nicht verwandte Commits in einem einzigen Commit zurücksetzen. Zum Beispiel, um B und D zurückzusetzen, aber nicht C.
Referenz: https://www.kernel.org/pub/software/scm/git/docs/git-revert.html
Danke Honza Haering für die Korrektur
quelle
git revert -n B..D
setzt Commit B nicht zurück, nur C und D. setzen auchgit revert -n B^..D
B zurück.git revert -n master~5..master~2
, heißt es, dass das fünftletzte Commit enthalten ist. Istmaster~5
aber eigentlich 6. letzter Commit. Siehe Revisionsauswahl in Git-Dokumenten für detaillierte Informationen zur..
Notation :-)Das
git revert OLDER_COMMIT^..NEWER_COMMIT
hat bei mir nicht funktioniert.Ich habe verwendet
git revert -n OLDER_COMMIT^..NEWER_COMMIT
und alles ist gut. Ich benutze die Git-Version1.7.9.6
.quelle
-n
oder--no-commit
werden alle Änderungen im gesamten Bereich in einem einzigen Commit zurückgesetzt, anstatt für jedes Commit im Bereich ein Commit zum Zurücksetzen zu erstellen. Das Endergebnis ist das gleiche wie in, die gleichen Änderungen werden zurückgesetzt. Kommt nur darauf an, wie deine Git-Geschichte aussehen soll.Verwenden Sie
git rebase -i
diese Option, um die relevanten Commits zu einem zusammenzufassen. Dann müssen Sie nur noch ein Commit zurücksetzen.quelle