Ich habe versucht, mein Commit in Git rückgängig zu machen. Ist es gefährlich zu benutzen git reset --hard HEAD~1
?
Was ist der Unterschied zwischen verschiedenen Optionen für git reset
?
Ich habe versucht, mein Commit in Git rückgängig zu machen. Ist es gefährlich zu benutzen git reset --hard HEAD~1
?
Was ist der Unterschied zwischen verschiedenen Optionen für git reset
?
Antworten:
git reset
kennt 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.
Bei Verwendung git reset --soft HEAD~1
entfernen 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 commit
wird ein Commit mit genau den Änderungen erstellt, die Sie zuvor "entfernt" haben.
Dies ist der Standardmodus und sehr ähnlich zu Soft. Wenn git reset HEAD~1
Sie 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.
Bei der Verwendung git reset --hard HEAD~1
werden 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 status
Befehl ausführen, werden Sie darauf hingewiesen, dass Sie keine Änderungen in Ihrem Repository haben.
Gehen Sie vorsichtig mit diesem. Wenn Sie versehentlich nicht git
festgeschriebene Änderungen entfernen, die nie nachverfolgt wurden (sprich: festgeschrieben oder zumindest dem Index hinzugefügt), haben Sie keine Möglichkeit, sie wieder zu verwenden git
.
git reset --keep HEAD~1
ist 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 reset
ein 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 reset
wurde, weiterhin wiederherstellen, indem Sie den SHA-1-Schlüssel ermitteln, z. B. mit einem Befehl wie git reflog
.
--hard
ist fast nie das Richtige, da dies --keep
viel sicherer ist und für die meisten Senarios gilt, in denen gearbeitet wird --hard
. Das Trainieren Ihrer Finger --keep
könnte Sie eines Tages retten ...
keep
. ;)
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.)
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
git reset --help
was (meiner Meinung nach) die fünf Modi oder zumindest die beiden vom OP angeforderten Modi recht gut erklärt.
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.