Diese drei Befehle haben völlig unterschiedliche Zwecke. Sie sind sich nicht einmal annähernd ähnlich.
git revert
Dieser Befehl erstellt ein neues Commit, das die Änderungen eines vorherigen Commits rückgängig macht. Dieser Befehl fügt dem Projekt einen neuen Verlauf hinzu (der vorhandene Verlauf wird nicht geändert).
git checkout
Dieser Befehl checkt Inhalte aus dem Repository aus und fügt sie in Ihren Arbeitsbaum ein. Dies kann auch andere Auswirkungen haben, je nachdem, wie der Befehl aufgerufen wurde. Beispielsweise kann auch geändert werden, an welchem Zweig Sie gerade arbeiten. Dieser Befehl nimmt keine Änderungen am Verlauf vor.
git reset
Dieser Befehl ist etwas komplizierter. Es macht tatsächlich ein paar verschiedene Dinge, je nachdem, wie es aufgerufen wird. Es ändert den Index (den sogenannten "Staging-Bereich"). Oder es ändert sich, auf welche Festschreibung ein Zweigkopf gerade zeigt. Dieser Befehl kann den vorhandenen Verlauf ändern (indem das Commit geändert wird, auf das ein Zweig verweist).
Verwenden dieser Befehle
Wenn irgendwo in der Projekthistorie ein Commit durchgeführt wurde und Sie später entscheiden, dass das Commit falsch ist und nicht hätte durchgeführt werden dürfen, git revert
ist dies das Werkzeug für den Job. Dadurch werden die durch das fehlerhafte Festschreiben eingeführten Änderungen rückgängig gemacht und das "Rückgängigmachen" in der Historie aufgezeichnet.
Wenn Sie eine Datei in Ihrem Arbeitsbaum geändert, die Änderung jedoch nicht festgeschrieben haben, können Sie git checkout
eine Kopie der Datei aus dem Repository auschecken.
Wenn Sie eine Festschreibung vorgenommen haben, diese aber noch nicht an Dritte weitergegeben haben und entscheiden, dass Sie sie nicht möchten, können Sie git reset
den Verlauf so umschreiben, dass es so aussieht, als hätten Sie diese Festschreibung nie vorgenommen.
Dies sind nur einige der möglichen Nutzungsszenarien. Es gibt andere Befehle, die in bestimmten Situationen nützlich sein können, und die obigen drei Befehle haben auch andere Verwendungszwecke.
git reset
undgit checkout
kann genau die gleiche Sache tun. Zu sagen, dass sie "nicht einmal im entferntesten ähnlich" sind, ist nicht nur eine Übertreibung: Es ist nicht einmal im entferntesten wahr. Diese beiden Befehle können so viele verschiedene Dinge tun, von denen sich einige vollständig überschneiden. Beispiel:git reset --hard
undgit checkout -- .
wird genau das Gleiche tun. Und logischerweisegit reset --hard <path>
undgit checkout <path>
sollte auch genau das Gleiche tun - git hindert Sie jedoch daran. Diese beiden Befehle zu verwechseln ist SEHR einfach.git reset --hard <path>
Sie könnengit checkout <path>
, weil die beiden Befehle etwas völlig anderes bewirken.git reset
weist Git an, HEAD auf ein anderes Commit zu verschieben.git checkout
Auf der anderen Seite bittet Git überhaupt nichts mit HEAD zu tun. Es lässt HEAD in Ruhe und checkt lediglich eine Datei aus. Ja, Sie können sie so herstellen, dass sie ähnliche Effekte haben. Aber was sie tatsächlich tun, ist völlig anders.Angenommen, Sie hatten Commits:
git revert B
, erstellt ein Commit, das Änderungen in rückgängig machtB
.git revert A
, erstellt ein Commit, das Änderungen in rückgängig macht, Änderungen inA
jedoch nicht berührtB
Beachten Sie, dass das Zurücksetzen von nicht möglich ist , wenn Änderungen in
B
von Änderungen in abhängig sind .A
A
git reset --soft A
, ändert den Commit-Verlauf und das Repository. Das Staging- und Arbeitsverzeichnis befindet sich weiterhin im Status vonC
.git reset --mixed A
ändert den Festschreibungsverlauf, das Repository und das Staging. Das Arbeitsverzeichnis befindet sich weiterhin im Status vonC
.git reset --hard A
, ändert den Commit-Verlauf, das Repository, das Staging und das Arbeitsverzeichnis. Sie werden in den Zustand vonA
vollständig zurückkehren.quelle
git revert
wird verwendet, um ein vorheriges Commit rückgängig zu machen. In git können Sie ein früheres Commit nicht ändern oder löschen. (Eigentlich können Sie das, aber es kann Probleme verursachen.) Anstatt das frühere Festschreiben zu bearbeiten, führt das Zurücksetzen ein neues Festschreiben ein, das ein früheres umkehrt.git reset
wird verwendet, um Änderungen in Ihrem Arbeitsverzeichnis rückgängig zu machen, die noch nicht festgeschrieben wurden.git checkout
wird verwendet, um eine Datei von einem anderen Commit in Ihren aktuellen Arbeitsbaum zu kopieren. Die Datei wird nicht automatisch festgeschrieben.quelle
git reset --soft
Setzt nur den HEAD zurück,git reset --hard
setzt den HEAD und Ihr Arbeitsverzeichnis zurück.git checkout
ändert Ihren Arbeitsbaum,git reset
Ändert, auf welche Referenz der Zweig verweist, auf den Sie verweisen.git revert
Fügt ein Commit hinzu, das Änderungen rückgängig macht.quelle
git reset
Ändert nicht nur das Commit, auf das ein Zweig verweist , sondern dient auch zum Entfernen von Dateien aus dem Index und kann die Arbeitskopie mitgit reset --mixed
(Standardeinstellung) ändern .Zurücksetzen - Auf der Commit-Ebene ist das Zurücksetzen eine Möglichkeit, die Spitze eines Zweigs auf ein anderes Commit zu verschieben. Dies kann verwendet werden, um Commits aus dem aktuellen Zweig zu entfernen.
Zurücksetzen - Durch das Zurücksetzen wird ein Commit rückgängig gemacht, indem ein neues Commit erstellt wird. Dies ist ein sicherer Weg, um Änderungen rückgängig zu machen, da keine Möglichkeit besteht, den Commit-Verlauf neu zu schreiben. Vergleichen Sie dies mit dem Zurücksetzen von Git, wodurch sich der vorhandene Commit-Verlauf ändert. Aus diesem Grund sollte git revert verwendet werden, um Änderungen in einem öffentlichen Zweig rückgängig zu machen, und git reset sollte reserviert werden, um Änderungen in einem privaten Zweig rückgängig zu machen.
Sie können einen Blick auf diesen Link werfen - Zurücksetzen, Auschecken und Zurücksetzen
quelle
Wenn Sie den Baum gebrochen haben, aber den Code nicht festgeschrieben haben, können Sie ihn verwenden
git reset
. Wenn Sie nur eine Datei wiederherstellen möchten, können Sie ihn verwendengit checkout
.Wenn Sie den Baum gebrochen und den Code festgeschrieben haben, können Sie ihn verwenden
git revert HEAD
.http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html
quelle