wake-up-neo.net

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

Ich habe versucht, mein Engagement in git aufzuheben. Ist die Verwendung von git reset --hard HEAD~1 gefährlich?

Was ist der Unterschied zwischen den verschiedenen Optionen für git reset?

Gibt es auch eine andere Möglichkeit, ein Commit von Sourcetree Gui rückgängig zu machen?

19
mesutali

git reset kennt fünf "Modi": weich, gemischt, hart, verschmelzen und behalten. Ich werde mit den ersten drei anfangen, da dies die Modi sind, auf die Sie normalerweise treffen. Danach finden Sie einen netten kleinen Bonus, also bleiben Sie dran.

soft

Wenn Sie git reset --soft HEAD~1 verwenden, entfernen Sie den letzten Commit aus dem aktuellen Zweig. Die Dateiänderungen verbleiben jedoch in Ihrem Arbeitsbaum . Die Änderungen bleiben auch in Ihrem Index. Wenn Sie einen git commit verwenden, wird ein Commit erstellt, das genau die gleichen Änderungen wie das Commit enthält, das Sie zuvor "entfernt" haben.

gemischt

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

schwer

Wenn Sie git reset --hard HEAD~1 verwenden, werden Sie alle nicht festgeschriebenen Änderungen verlieren zusätzlich zu den Änderungen, die im letzten Commit vorgenommen wurden. Die Änderungen verbleiben nicht in Ihrem Arbeitsbaum. Wenn Sie einen git status-Befehl ausführen, werden Sie darauf hingewiesen, dass sich in Ihrem Repository keine Änderungen befinden.

Treten Sie vorsichtig mit diesem ein. Wenn Sie versehentlich nicht festgeschriebene Änderungen entfernen, die nie von git verfolgt wurden (sprich: festgeschrieben oder zumindest dem Index hinzugefügt), haben Sie keine Möglichkeit, sie mit git zurückzubekommen.

Bonus

behalten

git reset --keep HEAD~1 ist interessant und nützlich. Es werden nur die Dateien zurückgesetzt, die sich zwischen der aktuellenHEAD und dem angegebenen Commit unterscheiden. Es bricht den Reset ab, wenn bei einer dieser Dateien Änderungen vorgenommen wurden. Es ist im Grunde 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 dem falschen Zweig begonnen haben.


Mehr dazu lesen Sie in der Dokumentation git reset .

Hinweis
Wenn Sie git reset zum Entfernen eines Commits ausführen, geht das Commit nicht wirklich verloren, es gibt einfach keinen Verweis auf es oder eines seiner Kinder. Sie können ein mit git reset "gelöschtes" Commit immer noch wiederherstellen, indem Sie den SHA-1-Schlüssel suchen, beispielsweise mit einem Befehl wie git reflog.

61
Sascha Wolf

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

http://git-scm.com/blog/2011/07/11/reset.html

Das Zurücksetzen von --hard kann ziemlich gefährlich sein, da es Ihre Arbeitskopie überschreibt, ohne zu prüfen. Wenn Sie die Datei also noch nicht festgelegt haben, ist sie weg. 

Was Source-Baum angeht, gibt es keine Möglichkeit, Commits rückgängig zu machen. Es würde höchstwahrscheinlich sowieso einen Reset unter den Abdeckungen verwenden

4
FamiliarPie

Git reset hat 5 Hauptmodi: soft, mixed, merged, hard, keep . Der Unterschied zwischen ihnen besteht darin, Kopf, Stufe (Index), Arbeitsverzeichnis zu ändern oder nicht zu ändern. 

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

Wenn Sie also Ihr Commit rückgängig machen wollen, 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, korrigieren, zum Index hinzufügen und erneut festschreiben. 

Mit der "--hard" erhalten Sie in Ihrem Projekt eine saubere Sache. Als ob sich seit dem letzten Commit nichts geändert hätte. Wenn Sie sicher sind, dass Sie das wollen, dann gehen Sie vorwärts. Sobald Sie dies getan haben, verlieren Sie Ihr letztes Commit vollständig. (Hinweis: Es gibt immer noch Möglichkeiten, das verlorene Commit wiederherzustellen). 

2
apadana

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

--soft

Berührt die Indexdatei oder den Arbeitsbaum überhaupt nicht (setzt jedoch den Kopf zurück, wie alle Modi dies tun). Dadurch bleiben alle Ihre geänderten Dateien "Änderungen für den Commit", wie es der Git-Status bedeuten würde.

--hard

Setzt den Index und den Arbeitsbaum zurück. Alle Änderungen an verfolgten Dateien in der Arbeitsstruktur seit dem werden verworfen.

0
Alexandr