2015-08-26 3 views
6

Lassen Sie uns sagen, dass ich alle Änderungen von früheren Commits eingeführt rückgängig machen möchten.Unterschied zwischen git reset --hard und git checkout

Soweit ich verstehe, wird git reset --hard <specified commit> entfernen Sie alle bis zum angegebenen verpflichten verpflichtet auf, und alle Änderungen rückgängig zu machen.
Auf der anderen Seite git checkout <specified commit> wird mein Verzeichnis ändern, das Commit angegeben zu reflektieren.

Also, wenn ich git reset nach git checkout wird es das gleiche Ergebnis wie git reset --hard haben?

Alternativ, wenn ich einfach git commit nach git checkout, überschreibt das neu erstellte Commit die bestehenden Commits?

+0

Wenn Sie nach dem Checkout einen Commit ausführen, werden Sie einen Verzweigungspunkt, nicht ein Überschreiben. –

Antwort

4

Auf den Punkt gebracht, sind git Commits ein Baum und Zweige sind nur Zeiger auf einige Commits.

git checkout <specified commit> nicht den Zweig Zeiger bewegen. Wenn Sie dies tun, sind Sie in losgelöstem Kopfzustand. Sie werden diese Meldung sehen, die ziemlich selbsterklärend ist:

Sie befinden sich im Status 'Abgelöste HEAD'. Sie können sich umsehen, experimentelle Änderungen vornehmen und sie festschreiben, und Sie können alle Commits verwerfen, die Sie in diesem Zustand vornehmen, ohne irgendwelche Zweige zu beeinträchtigen, indem Sie eine andere Kasse ausführen.

Wenn Sie einen neuen Zweig erstellen möchten, um die von Ihnen erstellten Commits beizubehalten, können Sie dies (jetzt oder später) tun, indem Sie -b erneut mit dem Befehl checkout ausführen. Beispiel:

git checkout -b new_branch_name

Ein weiterer Unterschied besteht darin, dass git checkout ist sicherer, weil es nicht die Änderungen in dem Arbeits Baum lehnt, und Sie werden alle Commits mit it¹ nicht verlieren.

git reset --hard <specified commit>, auf der anderen Seite wird Ihre aktuelle Zweigstelle auf die angegebene Festschreibung bewegen und verlieren Sie alle Änderungen in Ihrem Arbeitsbaum. Wenn Sie zu einem älteren Commit wechseln und die neueren Commits sich nicht in einem anderen Zweig befinden, werden Sie diese neueren Commits ebenfalls verlieren . Es ist keine sichere Operation und tue dies nicht, es sei denn, du verstehst wirklich, was du tust.

Siehe auch these great answers für Informationen darüber, wie ein git commit rückgängig zu machen.

Sie können auch von einem GUI-Tool wie SourceTree profitieren.


¹ - na ja, es sei denn, Sie bereits in freistehendem Kopf Zustand auf einigen baumelnden sind begehen, aber normalerweise sollten Sie sich keine Sorgen.

3

Also, wenn ich git reset nach git checkout wird es das gleiche Ergebnis wie git reset --hard haben?

Nein.git reset (mit --hard oder einer anderen Option) setzt den HEAD zurück, so dass Sie immer die Commits verlieren, es sei denn, Sie geben kein Commit für das Zurücksetzen an.

Nachdem Sie git checkout <commit> tun, sind Sie in einem abgetrennten HEAD-Zustand, so git reset ist ein bisschen sinnlos, weil Sie keinen Zweig zurückgesetzt werden.

Alternativ kann, wenn ich einfach git commit nach git checkout wird das neu verpflichten erstellt, die bestehenden Commits schreiben?

Nein. Da Sie sich wieder in einem getrennten HEAD-Zustand befinden. Sie erstellen im Wesentlichen Commits in einem Geisterzweig.

Die sicherste Sache ist, immer einen neuen Zweig mit git checkout -b zu erstellen und sobald Sie sicher sind, dass Sie Ihren anderen Zweig zurücksetzen möchten, tun Sie dann git reset --hard.