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.
Wenn Sie nach dem Checkout einen Commit ausführen, werden Sie einen Verzweigungspunkt, nicht ein Überschreiben. –