webentwicklung-frage-antwort-db.com.de

Rollback auf ein altes Git-Commit in einem öffentlichen Repo

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.

685
David

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.

1023
Alex Reisner

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?

175
Naga Kiran

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.

82
Ben

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.

Dokumentation

39
user456814

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.

23
Igor
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.

9
jthill

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

1
ken

Hier ist ein Beispiel dafür

    cd /yourprojects/project-acme 


    git checkout efc11170c78 .
0
mcvkr

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.

0
Naved Ahmad

Möchten Sie den HEAD getrennten Modus?

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
0
Karl Morrison

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.

0
Donato