752 Stimmen

Rückgängig machen einer Übergabe durch einen SHA-Hash in Git?

Mir ist nicht klar, wie git revert Werke. Ich möchte zum Beispiel zu einem Commit zurückkehren, der sechs Commits hinter dem Head liegt, und dabei alle Änderungen in den dazwischen liegenden Commits rückgängig machen.

Sagen Sie seine SHA Hash ist 56e05fced214c44a37759efa2dfc25a65d8ae98d . Warum kann ich dann nicht einfach etwas tun wie:

git revert 56e05fced214c44a37759efa2dfc25a65d8ae98d

1 Stimmen

Auch wenn diese Frage älter ist als die Frage, die jetzt als Duplikat markiert ist, hat diese eine bessere Antwort. meta.stackexchange.com/questions/147643/

20 Stimmen

Diese Frage und die oberste Antwort hier können Git-Benutzer verwirren. Nur zum besseren Verständnis der Terminologie: Sie brauchen nicht zurückkehren zu eine Verpflichtung. Sie können entweder zurückgesetzt auf eine Übergabe (das ist wie eine Zeitreise mit der Zeitmaschine) oder zurückkehren einen Commit (das ist so, als ob man einen Commit zurückziehen würde, als ob er nie existiert hätte - allerdings bleibt die Revert-Information in der Historie erhalten, so dass man einen Revert wieder rückgängig machen kann, wenn man das möchte) Beachten Sie auch, dass Sie nicht das m-Flag verwenden und eine Commit-Nachricht eingeben sollten, wenn Sie während des Prozesses Konflikte bekommen. Die automatische Meldung, die Git liefert, ist informativer, wenn man in der Historie zurückblickt.

1 Stimmen

@alexrogins Was bedeutet es, einen Commit zurückzuziehen, als hätte er nie existiert? Ich bin mir auch nicht sicher, was "Revert a revert" bedeutet - ich schätze den Kommentar, gute Informationen, ich suche nur nach mehr Details über Ihre Perspektive.

82voto

Flueras Bogdan Punkte 8839

Wenn Ihre Änderungen bereits in einem öffentlich, gemeinsam entfernt, und Sie möchten alle Übertragungen zwischen HEAD y <sha-id> dann können Sie einen Übergabebereich an git revert ,

git revert 56e05f..HEAD

und macht alle Übertragungen zwischen 56e05f y HEAD (ohne den Startpunkt des Bereichs, 56e05f ).

2 Stimmen

Beachten Sie, dass dies bei der Rückgängigmachung von mehreren hundert Commits eine Weile dauern kann, da Sie jeden Revert einzeln committen müssen.

11 Stimmen

@splicer Sie müssen nicht jede Übergabe einzeln rückgängig machen, Sie können entweder die --no-edit um zu vermeiden, dass Sie einzelne Commit-Nachrichten erstellen müssen, oder Sie können die Option --no-commit um die Rückbuchungen auf einmal vorzunehmen.

0 Stimmen

@Cupcake Sie haben Recht HEAD..56e05f funktioniert bei mir nicht, aber 56e05f..HEAD hat den Zweck erfüllt

6voto

Tuyen Tran Punkte 99

Dies ist besser verständlich:

git checkout 56e05fced -- .
git add .
git commit -m 'Revert to 56e05fced'

Und um zu beweisen, dass es funktioniert:

git diff 56e05fced

6 Stimmen

Ich fürchte, das ist im Allgemeinen nicht richtig. Der Checkout aktualisiert (glaube ich) nur Pfade, die existieren, wenn also eine Datei seit 56e05fced wird es nicht inszeniert werden, indem man git checkout 56e05fced -- .

1 Stimmen

Diese Lösung löscht keine neuen Dateien, die seit 56e05fced , wie ein git reset --hard oder eine git revert würde. Sie sollten diese Befehle wirklich verwenden, wenn Sie den Zustand von 56e05fced , nicht git checkout .

0 Stimmen

Hinweis: Dies versetzt Sie in einen Zustand der Losgelöstheit. Nicht ratsam!

3voto

longda Punkte 9845

Sollte so einfach sein wie:

git reset --hard 56e05f

Das bringt Sie zurück zu diesem bestimmten Zeitpunkt.

4 Stimmen

...und ist auch sehr gefährlich, da es die gesamte Geschichte, einschließlich der Arbeit anderer Leute, auslöscht. Hüten Sie sich vor diesem!

-2voto

Jake Punkte 1926

Das könnte funktionieren:

git checkout 56e05f
echo ref: refs/heads/master > .git/HEAD
git commit

3 Stimmen

Dies bewirkt im Grunde dasselbe wie git reset --hard 56e05f nur dass dies weniger sicher und eher hakelig ist. Sie könnten genauso gut verwenden Charle's Lösung o Jakub's Lösung .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X