Ich versuche zu lernen, wie man Dateien und Projekte in einem früheren Zustand wiederherstellt oder zurücksetzt, und verstehe nicht den Unterschied zwischen git revert
, checkout
et reset
. Warum gibt es 3 verschiedene Befehle für scheinbar denselben Zweck, und wann sollte man den einen dem anderen vorziehen?
Antworten
Zu viele Anzeigen?Diese drei Befehle haben völlig unterschiedliche Ziele. Sie sind sich nicht einmal im Entferntesten ähnlich.
git revert
Dieser Befehl erzeugt einen neuen Commit, der die Änderungen eines vorherigen Commits rückgängig macht. Dieser Befehl fügt dem Projekt eine neue Historie hinzu (er ändert die bestehende Historie nicht).
git checkout
Dieser Befehl checkt Inhalte aus dem Repository aus und legt sie in Ihrem Arbeitsbaum ab. Er kann auch andere Auswirkungen haben, je nachdem, wie der Befehl aufgerufen wurde. Zum Beispiel kann er auch den Zweig ändern, an dem Sie gerade arbeiten. Dieser Befehl nimmt keine Änderungen an der Historie vor.
git reset
Dieser Befehl ist ein wenig komplizierter. Je nachdem, wie er aufgerufen wird, tut er verschiedene Dinge. Er ändert den Index (die so genannte "Staging Area"). Oder er ändert den Commit, auf den ein Branch Head gerade zeigt. Dieser Befehl kann die bestehende Historie ändern (indem er den Commit ändert, auf den ein Zweig verweist).
Mit diesen Befehlen
Wenn irgendwo in der Projekthistorie ein Commit gemacht wurde und Sie später feststellen, dass der Commit falsch ist und nicht hätte gemacht werden sollen, dann git revert
ist das richtige Werkzeug für diese Aufgabe. Es macht die durch die fehlerhafte Übertragung eingeführten Änderungen rückgängig und speichert das "Undo" in der Historie.
Wenn Sie eine Datei in Ihrem Arbeitsbaum geändert haben, aber die Änderung nicht festgeschrieben haben, dann können Sie git checkout
um eine frische Kopie der Datei aus dem Repository auszuchecken.
Wenn Sie einen Commit gemacht haben, ihn aber mit niemandem geteilt haben und Sie entscheiden, dass Sie ihn nicht wollen, dann können Sie git reset
um die Historie so umzuschreiben, dass es so aussieht, als hätten Sie diesen Commit nie gemacht.
Dies sind nur einige der möglichen Einsatzszenarien. Es gibt noch weitere Befehle, die in bestimmten Situationen nützlich sein können, und die drei oben genannten Befehle haben auch noch andere Verwendungszwecke.
Nehmen wir an, Sie hätten Commits:
C
B
A
git revert B
wird eine Übergabe erstellt, die Änderungen in B
.
git revert A
wird eine Übergabe erstellt, die die Änderungen in A
aber nicht auf Änderungen in B
Beachten Sie, dass bei Änderungen in B
sind abhängig von Veränderungen in A
der Rückläufer von A
ist nicht möglich.
git reset --soft A
ändert den Übergabeverlauf und das Repository; das Bereitstellungs- und das Arbeitsverzeichnis sind weiterhin auf dem Stand von C
.
git reset --mixed A
ändert die Commit-Historie, das Repository und das Staging; das Arbeitsverzeichnis bleibt auf dem Stand von C
.
git reset --hard A
ändern Sie den Übergabeverlauf, das Repository, das Staging- und das Arbeitsverzeichnis; Sie kehren zum Zustand von A
vollständig.
git revert
wird verwendet, um eine vorherige Übertragung rückgängig zu machen. In Git kann man einen früheren Commit nicht ändern oder löschen. (Eigentlich schon, aber das kann zu Problemen führen.) Anstatt also den früheren Commit zu bearbeiten, führt revert einen neuen Commit ein, der einen früheren rückgängig macht.git reset
wird verwendet, um Änderungen in Ihrem Arbeitsverzeichnis rückgängig zu machen, die noch nicht übertragen wurden.git checkout
wird verwendet, um eine Datei aus einer anderen Übergabe in Ihren aktuellen Arbeitsbaum zu kopieren. Dabei wird die Datei nicht automatisch übertragen.
Zurücksetzen - Auf der Commit-Ebene ist das Zurücksetzen eine Möglichkeit, die Spitze eines Zweigs auf einen anderen Commit zu verschieben. Dies kann verwendet werden, um Commits aus dem aktuellen Zweig zu entfernen.
Rückgängig - Das Rückgängigmachen einer Übergabe macht eine Übergabe rückgängig, indem es eine neue Übergabe erzeugt. Dies ist ein sicherer Weg, um Änderungen rückgängig zu machen, da es keine Möglichkeit gibt, die Commit-Historie neu zu schreiben. Im Gegensatz zu git reset, das den bestehenden Commit-Verlauf verändert. Aus diesem Grund sollte git revert verwendet werden, um Änderungen an einem öffentlichen Zweig rückgängig zu machen, und git reset sollte für das Rückgängigmachen von Änderungen an einem privaten Zweig reserviert sein.
Sie können sich unter diesem Link umsehen. Zurücksetzen, Auschecken und Rückgängig machen
- See previous answers
- Weitere Antworten anzeigen