Was ist der Unterschied zwischen 'git reset --hard HEAD ~ 1' und 'git reset --soft HEAD ~ 1'?

Antworten:

176

git resetkennt fünf "Modi": weich, gemischt, hart, zusammenführen und behalten. Ich werde mit den ersten drei beginnen, da dies die Modi sind, denen Sie normalerweise begegnen. Danach finden Sie einen netten kleinen Bonus, also bleiben Sie dran.

Sanft

Bei Verwendung git reset --soft HEAD~1entfernen Sie das letzte Commit aus dem aktuellen Zweig, die Dateiänderungen bleiben jedoch in Ihrem Arbeitsbaum erhalten . Außerdem bleiben die Änderungen in Ihrem Index erhalten. Wenn Sie also mit a folgen, git commitwird ein Commit mit genau den Änderungen erstellt, die Sie zuvor "entfernt" haben.

gemischt

Dies ist der Standardmodus und sehr ähnlich zu Soft. Wenn git reset HEAD~1Sie ein Commit mit Ihnen "entfernen", bleiben die Änderungen in Ihrem Arbeitsbaum erhalten, jedoch nicht im Index. Wenn Sie also das Commit "wiederholen" möchten, müssen Sie die Änderungen ( git add) vor dem Commit hinzufügen.

hart

Bei der Verwendung git reset --hard HEAD~1werden Sie alle Uncommited Änderungen verlieren , zusätzlich zu den in den letzten eingeführten Änderungen. Die Änderungen bleiben nicht in Ihrem Arbeitsbaum. Wenn Sie also einen git statusBefehl ausführen, werden Sie darauf hingewiesen, dass Sie keine Änderungen in Ihrem Repository haben.

Gehen Sie vorsichtig mit diesem. Wenn Sie versehentlich nicht gitfestgeschriebene Änderungen entfernen, die nie nachverfolgt wurden (sprich: festgeschrieben oder zumindest dem Index hinzugefügt), haben Sie keine Möglichkeit, sie wieder zu verwenden git.

Bonus

behalten

git reset --keep HEAD~1ist interessant und nützlich. Es werden nur die Dateien zurückgesetzt, die sich zwischen dem aktuellen HEAD und dem angegebenen Commit unterscheiden. Das Zurücksetzen wird abgebrochen, wenn eine dieser Dateien nicht festgeschriebene Änderungen aufweist. Es handelt sich im Grunde genommen um eine sicherere Version von hard.

Dieser Modus ist besonders nützlich, wenn Sie eine Reihe von Änderungen vorgenommen haben und zu einem anderen Zweig wechseln möchten, ohne diese Änderungen zu verlieren - beispielsweise wenn Sie mit der Arbeit am falschen Zweig begonnen haben.


Weitere Informationen hierzu finden Sie in der Dokumentation zum Zurücksetzen des Git .

Hinweis
Wenn Sie git resetein Commit entfernen, geht das Commit nicht wirklich verloren. Es gibt nur keinen Verweis darauf oder auf eines seiner untergeordneten Elemente. Sie können ein Commit, mit dem "gelöscht" git resetwurde, weiterhin wiederherstellen, indem Sie den SHA-1-Schlüssel ermitteln, z. B. mit einem Befehl wie git reflog.

Sascha Wolf
quelle
1
Ich bin nicht der Meinung, dass diese 3 diejenigen sind, die wir normalerweise verwenden sollten. Sie sind die 3, die zuerst verfügbar waren, also reden die Leute mehr über diese 3, aber es --hardist fast nie das Richtige, da dies --keepviel sicherer ist und für die meisten Senarios gilt, in denen gearbeitet wird --hard. Das Trainieren Ihrer Finger --keepkönnte Sie eines Tages retten ...
Matthieu Moy
Ich habe nicht versucht vorzuschlagen, dass wir sie verwenden sollten , sondern nur, dass dies Befehle sind, denen man die meiste Zeit begegnet. Sie können die Antwort jederzeit nach Belieben bearbeiten.
Sascha Wolf
Um ein bisschen mehr Details hinzuzufügen, verwenden Sie nach dem Zurücksetzen von git --soft HEAD ~ 1 mit git commit --reuse-message = HEAD @ {1} das letzte Commit mit dem erhaltenen alten Index, wie hier gezeigt. Stackoverflow.com/a/ 25930432/2883282
englealuze
3
@MatthieuMoy, drei Jahre zu spät, aber ich habe einen Abschnitt hinzugefügt keep. ;)
Sascha Wolf
Wie kann ich das letzte Commit rückgängig machen? Bitte helfen Sie. Wenn ich git reset --soft HEAD ~ 1 verwende, erhalte ich: fatal: mehrdeutiges Argument 'HEAD ~ 1': unbekannte Revision oder Pfad nicht im Arbeitsbaum. Verwenden Sie '-', um Pfade von Revisionen wie
elvis
6

Git Reset hat 5 Hauptmodi: weich, gemischt, zusammengeführt, hart, behalten . Der Unterschied zwischen ihnen besteht darin, Kopf, Stufe (Index) und Arbeitsverzeichnis zu ändern oder nicht zu ändern .

Git reset --hard ändert Kopf, Index und Arbeitsverzeichnis.
Git reset --soft ändert nur den Kopf. Keine Änderung an Index, Arbeitsverzeichnis.

Mit anderen Worten, wenn Sie Ihr Commit rückgängig machen möchten, sollte --soft gut genug sein. Aber danach haben Sie immer noch die Änderungen von Bad Commit in Ihrem Index und Arbeitsverzeichnis. Sie können die Dateien ändern, reparieren, zum Index hinzufügen und erneut festschreiben.

Mit dem --hard erhalten Sie einen sauberen Schiefer in Ihrem Projekt. Als ob sich seit dem letzten Commit nichts geändert hätte. Wenn Sie sicher sind, dass dies das ist, was Sie wollen, fahren Sie fort. Sobald Sie dies tun, verlieren Sie Ihr letztes Commit vollständig. (Hinweis: Es gibt immer noch Möglichkeiten, das verlorene Commit wiederherzustellen.)

Apadana
quelle
5

Dies ist ein nützlicher Artikel, der die Erklärung des Rücksetzbefehls grafisch zeigt.

https://git-scm.com/docs/git-reset

Zurücksetzen --hard kann sehr gefährlich sein, da es Ihre Arbeitskopie überschreibt, ohne sie zu überprüfen. Wenn Sie die Datei also überhaupt nicht festgeschrieben haben, ist sie verschwunden.

Was den Quellbaum betrifft, gibt es keine Möglichkeit, Commits rückgängig zu machen. Es würde höchstwahrscheinlich ohnehin Reset unter der Decke verwenden

FamiliarPie
quelle
+1 für den Link zur offiziellen Dokumentation. Ich würde auch erwähnen, git reset --helpwas (meiner Meinung nach) die fünf Modi oder zumindest die beiden vom OP angeforderten Modi recht gut erklärt.
ThanksForAllTheFish
1
Link ist unterbrochen. Wahrscheinlich ist dies die aktuelle Version: git-scm.com/docs/git-reset
Kiki Jewell
1

Dies ist der Hauptunterschied zwischen der Verwendung von git reset --hard und git reset --soft:

--soft

Berührt die Indexdatei oder den Arbeitsbaum überhaupt nicht (setzt jedoch den Kopf zurück, genau wie in allen Modi). Dadurch bleiben alle geänderten Dateien "Änderungen müssen festgeschrieben werden", wie der Git-Status es ausdrücken würde.

--hard

Setzt den Index und den Arbeitsbaum zurück. Alle Änderungen an nachverfolgten Dateien im Arbeitsbaum seitdem werden verworfen.

Alexandr
quelle
1
Das habe ich gesucht. Prägnant und genau.
Qasim