Wie setze ich ein Git-Repository auf einen früheren Commit zurück?

Lesezeit: 8 Minuten

Wie setze ich ein Git Repository auf einen fruheren Commit zuruck
Verrückter Serbe

Wie kehre ich von meinem aktuellen Status zu einem Snapshot zurück, der bei einem bestimmten Commit erstellt wurde?

Wenn ich mache git logdann bekomme ich folgende Ausgabe:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <[email protected]>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <[email protected]>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <[email protected]>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <[email protected]>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

Wie kehre ich zum Commit vom 3. November zurück, dh commit 0d1d7fc?

  • Verwandte So machen Sie den letzten Git-Commit rückgängig?.

    Benutzer456814

    23. Mai 2014 um 17:57 Uhr

  • Hier ist ein sehr klarer und ausführlicher Beitrag über das Rückgängigmachen von Dingen in Git, direkt von Github.

    – Aurelio

    8. Juni 2015 um 19:41 Uhr

  • Ich liebe Git, aber die Tatsache, dass es 35 Antworten auf etwas gibt, das unglaublich einfach sein sollte, offenbart ein riesiges Problem mit Git. Oder sind es die Unterlagen?

    – Der Muffinmann

    3. Januar 2018 um 22:26 Uhr

Wie setze ich ein Git Repository auf einen fruheren Commit zuruck
Yarin

Viele komplizierte und gefährliche Antworten hier, aber es ist eigentlich einfach:

git revert --no-commit 0766c053..HEAD
git commit

Dadurch wird alles vom HEAD zurück zum Commit-Hash zurückgesetzt, was bedeutet, dass dieser Commit-Status im Arbeitsbaum neu erstellt wird als ob jedes Commit danach 0766c053 zurückgegangen war. Sie können dann den aktuellen Baum committen, und es wird ein brandneues Commit erstellt, das im Wesentlichen dem Commit entspricht, zu dem Sie „zurückgekehrt“ sind.

(Die --no-commit flag lässt git alle Commits auf einmal zurücksetzen – andernfalls wirst du aufgefordert, eine Nachricht für jeden Commit im Bereich einzugeben, was deinen Verlauf mit unnötigen neuen Commits übersät.)

Das ist ein sichere und einfache Möglichkeit, zu einem früheren Zustand zurückzukehren. Der Verlauf wird nicht zerstört, sodass er für bereits veröffentlichte Commits verwendet werden kann.

  • Wenn Sie wirklich einzelne Commits haben möchten (anstatt alles mit einem großen Commit rückgängig zu machen), dann können Sie bestehen --no-edit anstatt --no-commitsodass Sie nicht für jede Umkehrung eine Commit-Nachricht bearbeiten müssen.

    Benutzer456814

    28. Juni 2014 um 20:11 Uhr

  • Wenn einer der Commits zwischen 0766c053..HEAD eine Zusammenführung ist, wird ein Fehler angezeigt (da kein -m angegeben ist). Dies kann denjenigen helfen, die darauf stoßen: stackoverflow.com/questions/5970889/…

    – timhc22

    21. November 2014 um 11:55 Uhr


  • $ git revert --no-commit 53742ae..HEAD kehrt zurück fatal: empty commit set passed

    – Alex G

    1. August 2016 um 20:30 Uhr


  • Wenn Sie dieses ‘..HEAD’ am Ende des Befehls entfernen, können Sie nur ein bestimmtes Commit entfernen. Zum Beispiel: git revert --no-commit 0766c053 entfernt nur die spezifischen Änderungen, die für 0766c053 vorgenommen wurden, wobei alle Änderungen nach 0766c053 unverändert bleiben.

    – Wensiso

    12. August 2021 um 14:22 Uhr

  • @yarin @timhc22 Ich versuche das, aber ich möchte den Zustand nach einer vorherigen Zusammenführung wiederherstellen. Jede Hilfe ist willkommen! Zuerst versuche ich: git revert --no-commit 5a7e223d6b2ffa5b26653e54db4644690731a7e2..HEAD Fehler: Commit 759cd2ae17703faa54e39cbf707c8aa86f1c8797 ist eine Zusammenführung, aber es wurde keine Option -m angegeben. Ich versuche dann: git revert --no-commit 5a7e223d6b2ffa5b26653e54db4644690731a7e2..HEAD -m 1 Fehler: Mainline wurde angegeben, aber Commit bec2ac84669d0c5dfb57bc9e3eeabb225da7b685 ist kein Merge.

    – aksg87

    24. September 2021 um 18:17 Uhr


  • Das habe ich getan, aber dann war ich nicht in der Lage, das Remote-Repository zu übergeben und zu pushen. Ich möchte, dass ein bestimmtes älteres Commit HEAD wird…

    – Lennon

    24. September 2012 um 18:17 Uhr

  • @Lennon. Angenommen, Sie haben eine Änderung vorgenommen, sich verpflichtet und sie vorangetrieben. Sie möchten, dass sowohl lokal als auch remote so aussehen, als ob dies nie passiert wäre. Zuerst git reset --hard HEAD^ Sie haben jetzt alle lokalen Änderungen vom letzten Commit weggeblasen. Dann: git push --force origin HEAD Dies nimmt den aktuellen HEAD-Commit im Lokal und überschreibt den HEAD im Remote, wodurch der letzte Commit entfernt wird. Hinweis: Dies ist keine sichere Methode zum Löschen von Geheimnissen, die versehentlich auf eine Fernbedienung übertragen wurden. Gehen Sie davon aus, dass alle Geheimnisse kompromittiert sind, und sehen Sie sich die Einschränkungen für „–force“ an: evilmartians.com/chronicles/…

    – Entropo

    29. August 2021 um 5:46 Uhr

  • Nach dem Zurücksetzen müssen Sie tun git push -f. Seien Sie SEHR vorsichtig, da dies die Commits vor demjenigen löscht, auf den Sie von Ihrem Remote-Zweig zurückgesetzt haben!

    – Jakob L.

    23. November 2021 um 17:30 Uhr

1646917091 83 Wie setze ich ein Git Repository auf einen fruheren Commit zuruck
Pogrindis

Die beste Option für mich und wahrscheinlich andere ist die Git-Reset-Option:

git reset --hard <commidId> && git clean -f

Dies war die beste Option für mich! Es ist einfach, schnell und effektiv!


** Hinweis: ** Wie in den Kommentaren erwähnt, tun Sie dies nicht, wenn Sie Ihren Zweig mit anderen Personen teilen, die Kopien der alten Commits haben

Auch aus den Kommentaren, wenn Sie eine weniger “ballzy” Methode wollten, die Sie verwenden könnten

git clean -i

  • Obligatorische Warnung: Tun Sie dies nicht wenn Sie Ihren Zweig mit anderen Personen teilen, die Kopien der alten Commits haben, da die Verwendung eines solchen Hard-Resets sie dazu zwingt, ihre Arbeit mit dem neu zurückgesetzten Zweig neu zu synchronisieren. Eine Lösung, die detailliert erklärt, wie Commits sicher rückgängig gemacht werden können, ohne dass die Arbeit durch einen Hard-Reset verloren geht, finden Sie in dieser Antwort.

    Benutzer456814

    28. Juni 2014 um 20:03 Uhr

  • Es ist erwähnenswert, dass dadurch alle nicht festgeschriebenen Dateien in Ihrem Quellverzeichnis dauerhaft gelöscht werden :/

    – Cynder

    15. Dezember 2021 um 4:58 Uhr

1646917091 800 Wie setze ich ein Git Repository auf einen fruheren Commit zuruck
Richardec

Bevor wir antworten, fügen wir etwas Hintergrund hinzu und erklären, was das ist HEAD ist.

Zunächst einmal, was ist HEAD?

HEAD ist einfach ein Verweis auf das aktuelle Commit (das neueste) im aktuellen Zweig. Es kann nur einen geben HEAD jederzeit (ausgenommen git worktree).

Der Inhalt von HEAD ist innen gespeichert .git/HEADund es enthält den 40-Byte-SHA-1-Hash des aktuellen Commit.


detached HEAD

Wenn Sie nicht auf dem neuesten Commit sind – das heißt HEAD zeigt auf einen früheren Commit in der Geschichte, der aufgerufen wird detached HEAD.

Diagramm zur Veranschaulichung des Konzepts des abgetrennten HEAD

Auf der Befehlszeile sieht es so aus – SHA-1-Hash anstelle des Zweignamens seit dem HEAD zeigt nicht auf die Spitze des aktuellen Zweigs:

Ausführen von git checkout HEAD^0 in einem Terminal


Einige Optionen zur Wiederherstellung von einem abgetrennten HEAD:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Dadurch wird ein neuer Zweig ausgecheckt, der auf das gewünschte Commit zeigt. Dieser Befehl checkt zu einem bestimmten Commit aus.

An dieser Stelle können Sie einen Zweig erstellen und ab diesem Punkt mit der Arbeit beginnen:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Sie können immer die verwenden reflog auch. git reflog zeigt jede Änderung an, die die aktualisiert hat HEAD und das Auschecken des gewünschten Reflog-Eintrags setzt das HEAD zurück zu diesem Commit.

Jedes Mal, wenn der HEAD geändert wird, gibt es einen neuen Eintrag in der reflog

git reflog
git checkout HEAD@{...}

Dies bringt Sie zurück zu Ihrem gewünschten Commit.

Ausführen von git reflog in einem Terminal


git reset HEAD --hard <commit_id>

“Beweg dein HEAD zurück zum gewünschten Commit.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Notiz: (Seit Git 2.7) Sie können auch die verwenden git rebase --no-autostash auch.

Dieses Schema zeigt, welcher Befehl was macht. Wie Sie dort sehen können reset && checkout modifiziere den HEAD.

Diagramm, das den Staging-Bereich und das Auschecken von HEAD veranschaulicht

  • Obligatorische Warnung: Tun Sie dies nicht wenn Sie Ihren Zweig mit anderen Personen teilen, die Kopien der alten Commits haben, da die Verwendung eines solchen Hard-Resets sie dazu zwingt, ihre Arbeit mit dem neu zurückgesetzten Zweig neu zu synchronisieren. Eine Lösung, die detailliert erklärt, wie Commits sicher rückgängig gemacht werden können, ohne dass die Arbeit durch einen Hard-Reset verloren geht, finden Sie in dieser Antwort.

    Benutzer456814

    28. Juni 2014 um 20:03 Uhr

  • Es ist erwähnenswert, dass dadurch alle nicht festgeschriebenen Dateien in Ihrem Quellverzeichnis dauerhaft gelöscht werden :/

    – Cynder

    15. Dezember 2021 um 4:58 Uhr

1646917092 370 Wie setze ich ein Git Repository auf einen fruheren Commit zuruck
Peter Mortensen

Sie können dies mit den folgenden zwei Befehlen tun:

git reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

Es wird Ihr vorheriges Git-Commit entfernen.

Wenn Sie Ihre Änderungen beibehalten möchten, können Sie auch Folgendes verwenden:

git reset --soft [previous Commit SHA id here]

Dann werden Ihre Änderungen gespeichert.

988000cookie-checkWie setze ich ein Git-Repository auf einen früheren Commit zurück?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy