Wie kann ich ein bestimmtes Commit in git zurücksetzen?
Die beste Antwort, die mir jemand geben konnte, war, git revert
X-mal zu verwenden, bis ich das gewünschte Commit erreiche.
Nehmen wir an, ich möchte auf ein Commit zurückgreifen, das 20 Commits alt ist. Ich muss es 20-mal ausführen.
Gibt es einen einfacheren Weg, dies zu tun?
Ich kann reset nicht verwenden, da dieses Repository öffentlich ist.
Versuche dies:
git checkout [revision] .
dabei ist [revision]
der Commit-Hash (zum Beispiel: 12345678901234567890123456789012345678ab
).
Vergessen Sie nicht den .
am Ende, sehr wichtig. Dadurch werden Änderungen auf den gesamten Baum angewendet. Sie sollten diesen Befehl im git-Projektstamm ausführen. Wenn Sie sich in einem Unterverzeichnis befinden, ändert dieser Befehl nur die Dateien im aktuellen Verzeichnis. Dann begehen Sie und Sie sollten gut sein.
Sie können dies durch rückgängig machen
git reset --hard
dadurch werden alle Änderungen aus dem Arbeitsverzeichnis und dem Bereitstellungsbereich gelöscht.
Um ein bestimmtes Commit auszuführen:
git reset --hard commit_sha
Für das Zurücksetzen von 10 werden zurückgegeben:
git reset --hard HEAD~10
Sie können "git revert" wie im folgenden Beitrag verwenden, wenn Sie den Verlauf nicht neu schreiben möchten
Wie kann ich das Git-Repository auf ein früheres Commit zurücksetzen?
Nun, ich denke, die Frage ist, was meinen Sie mit "Zurückrollen"? Wenn Sie nicht reset
können, weil sie öffentlich ist und Sie den Commit-Verlauf beibehalten möchten, meinen Sie damit, dass Ihre Arbeitskopie nur ein bestimmtes Commit widerspiegeln soll? Verwenden Sie git checkout
und den Commit-Hash.
Bearbeiten: Wie in den Kommentaren darauf hingewiesen wurde, werden Sie durch die Verwendung von git checkout
ohne Angabe eines Zweigs in einem Zustand "kein Zweig" angezeigt. Verwenden Sie git checkout <commit> -b <branchname>
zum Auschecken in einem Zweig oder git checkout <commit> .
zum Auschecken im aktuellen Zweig.
Das Originalplakat besagt:
Die beste Antwort, die mir jemand geben konnte, war, X-mal
git revert
Zu verwenden, bis ich das gewünschte Commit erreiche.Nehmen wir also an, ich möchte zu einem Commit zurückkehren, das 20 Commits alt ist. Ich müsste es 20 Mal ausführen.
Gibt es einen einfacheren Weg, dies zu tun?
Ich kann reset nicht verwenden, da dieses Repo öffentlich ist.
Es ist nicht erforderlich, git revert
X-mal zu verwenden. git revert
Kann einen Festschreibungsbereich als Argument akzeptieren, sodass Sie ihn nur einmal verwenden müssen, um einen Bereich von Festschreibungen wiederherzustellen. Zum Beispiel , wenn Sie die letzten 20 Commits wiederherstellen möchten:
git revert --no-edit HEAD~20..
Der Festschreibungsbereich HEAD~20..
Ist die Abkürzung für HEAD~20..HEAD
Und bedeutet "ab dem 20th übergeordnetes Element des Commits HEAD und alle nachfolgenden Commits auf HEAD zurücksetzen ".
Damit werden die letzten 20 Commits zurückgesetzt vorausgesetzt, es handelt sich nicht um Merge-Commits. Wenn es Merge-Commits gibt, Wenn Sie nicht alle in einem Befehl zurücksetzen können, müssen Sie sie einzeln mit zurücksetzen
git revert -m 1 <merge-commit>
Beachten Sie auch, dass ich einen Bereich mit git revert
Mit Git Version 1.9.0 getestet habe. Wenn Sie eine ältere Version verwenden von git kann die Verwendung eines Bereichs mit git revert
funktionieren oder auch nicht.
In diesem Fall wird git revert
Gegenüber git checkout
Bevorzugt.
Beachten Sie, dass im Gegensatz zu bei dieser Antwort wird git checkout
Verwendet mit git revert
Tatsächlich alle Dateien entfernt werden, die in einem der Ordner hinzugefügt wurden Bestätigt, dass Sie zurücksetzen . Dies ist der richtige Weg, um einen Bereich von Revisionen zurückzusetzen.
Schritt 1: Liste der Commits abrufen:
git log
Sie erhalten eine Liste wie in diesem Beispiel:
[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <[email protected]>
Date: Fri Jul 8 23:42:22 2016 +0300
This is last commit message
commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <[email protected]>
Date: Fri Jun 24 20:20:24 2016 +0300
This is previous commit message
commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <[email protected]>
Date: Thu Jun 23 00:41:55 2016 +0300
This is previous previous commit message
...
Schritt 2: benötigter Commit-Hash kopieren und zur Kasse einfügen:
git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f
Das ist alles.
git read-tree -um @ $commit_to_revert_to
werde es tun. Es ist "git Checkout", aber ohne HEAD zu aktualisieren.
Sie können den gleichen Effekt mit erreichen
git checkout $commit_to_revert_to
git reset --soft @{1}
wenn Sie es vorziehen, Bequemlichkeitsbefehle zusammenzusetzen.
Damit bleiben Sie mit Ihrem Arbeitsbaum und Index in dem gewünschten Zustand. Sie können einfach git commit
beenden.
Ich bin nicht sicher, was sich geändert hat, aber ich kann ein bestimmtes Commit ohne die Option --detach
nicht überprüfen. Der vollständige Befehl, der für mich funktioniert hat, war: git checkout --detach [commit hash]
Um aus dem abgelösten Zustand zurückzukehren, musste ich meine örtliche Zweigstelle auschecken: git checkout master
Hier ist ein Beispiel dafür
cd /yourprojects/project-acme
git checkout efc11170c78 .
Sie finden die Commit-ID für jedes Commit im Abschnitt "Commits" von GitHub/BitBucket/Gitlab. Es ist sehr einfach, nehmen wir an, Ihre Festschreibungs-ID ist 5889575 . Wenn Sie dann zu diesem Teil in Ihrem Code zurückkehren möchten, müssen Sie einfach etwas eingeben
git checkout 5889575 .
Dadurch gelangen Sie zu diesem Zeitpunkt in Ihrem Code.
Ich finde es schwer zu glauben, dass absolut niemand den Einzelkopfmodus erwähnt hat.
Wenn Sie die X-Zeit mit einem DETACHED HEAD auf ein bestimmtes Commit zurücksetzen möchten (dh, Sie können nicht # €% & nichts mehr tun), verwenden Sie auf jeden Fall Folgendes:
(Ersetzen Sie X durch die Anzahl der Commits, die Sie zurückgehen möchten.)
git checkout HEAD~X
I.E. um ein Commit zurückzugehen:
git checkout HEAD~1
Angenommen, Sie arbeiten an einem Projekt und nach einem Tag oder so. Sie stellen fest, dass eine Funktion immer noch Fehler anzeigt. Sie wissen jedoch nicht, welche Änderung Sie an dem Fehler vorgenommen haben. Sie müssen also frühere Arbeitszusagen fischen. Um zu einem bestimmten Commit zurückzukehren:
git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .
Ok, das Commit funktioniert für Sie. Kein Fehler mehr. Sie haben das Problem ermittelt. Jetzt können Sie zum letzten Commit zurückkehren:
git checkout 792d9294f652d753514dc2033a04d742decb82a5 .
Und checkout eine bestimmte Datei, bevor sie den Fehler verursacht hat (in meinem Fall verwende ich das Beispiel Gemfile.lock):
git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock
Auf diese Weise können Sie Fehler behandeln, die Sie in Commits erstellt haben, ohne die Fehler erst später zu erkennen.