Was ist der Unterschied zwischen Git Revert, Checkout und Reset?

273

Ich versuche zu lernen , wie die Wiederherstellung oder Rollback - Dateien und Projekte zu einem frühen Zustand, und versteht nicht den Unterschied zwischen git revert, checkoutund reset. Warum gibt es 3 verschiedene Befehle für scheinbar den gleichen Zweck und wann sollte jemand einen über den anderen wählen?

Haziz
quelle

Antworten:

460

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 revertist 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 checkouteine 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 resetden 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.

Dan Moulding
quelle
13
Die drei Befehle können also verwendet werden, um einige Arbeiten rückgängig zu machen, was bedeutet, dass sie nicht so "völlig unterschiedlich" sind. Gleiches Konzept, unterschiedliche Kontexte.
Bruno Santos
16
@BrunoSantos: Kerzenleuchter, Bleirohre, Dolche und Seile können verwendet werden, um Menschen zu ermorden, aber das bedeutet nicht, dass all diese Dinge besonders ähnlich sind.
Dan Moulding
12
@ Dan Mounlding - Eigentlich gibt es viele Fälle , in denen git resetund git checkoutkann 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 --hardund git checkout -- .wird genau das Gleiche tun. Und logischerweise git reset --hard <path>und git checkout <path>sollte auch genau das Gleiche tun - git hindert Sie jedoch daran. Diese beiden Befehle zu verwechseln ist SEHR einfach.
DanGordon
5
@ DanGordon Mir ist klar, dass wir hier wahrscheinlich nur eine Meinungsverschiedenheit haben werden. Trotzdem denke ich, ich sollte eine Erklärung geben. Sie können nicht genau das tun, was git reset --hard <path>Sie können git checkout <path>, weil die beiden Befehle etwas völlig anderes bewirken. git resetweist Git an, HEAD auf ein anderes Commit zu verschieben. git checkoutAuf 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.
Dan Moulding
46

Angenommen, Sie hatten Commits:

C
B
A

git revert B, erstellt ein Commit, das Änderungen in rückgängig macht B.

git revert A, erstellt ein Commit, das Änderungen in rückgängig macht, Änderungen in Ajedoch nicht berührtB

Beachten Sie, dass das Zurücksetzen von nicht möglich ist , wenn Änderungen in Bvon Änderungen in abhängig sind .AA

git reset --soft A, ändert den Commit-Verlauf und das Repository. Das Staging- und Arbeitsverzeichnis befindet sich weiterhin im Status von C.

git reset --mixed Aändert den Festschreibungsverlauf, das Repository und das Staging. Das Arbeitsverzeichnis befindet sich weiterhin im Status von C.

git reset --hard A, ändert den Commit-Verlauf, das Repository, das Staging und das Arbeitsverzeichnis. Sie werden in den Zustand von Avollständig zurückkehren.

Akavall
quelle
1
So intuitive Antwort .. wie wäre es mit Kasse
MJ Studio
29
  • git revertwird 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 checkoutwird verwendet, um eine Datei von einem anderen Commit in Ihren aktuellen Arbeitsbaum zu kopieren. Die Datei wird nicht automatisch festgeschrieben.
Jonathan
quelle
7
Ich glaube, Sie irren sich über "Git Reset". "git reset" setzt Ihren HEAD auf einen der vorherigen Commits zurück, Ihr Arbeitsverzeichnis wird nicht zurückgesetzt. Das Arbeitsverzeichnis wird durch "git checkout [Dateiname]" "zurückgesetzt"
luigi7up
11
git reset --softSetzt nur den HEAD zurück, git reset --hardsetzt den HEAD und Ihr Arbeitsverzeichnis zurück.
Ehryk
Git Reset - gemischt (Standard): nicht festgeschrieben + Änderungen auf der
Bühne
21
  • 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.
dan_waterworth
quelle
4
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 mit git reset --mixed(Standardeinstellung) ändern .
git reset --soft: Änderungen nicht festschreiben, Änderungen bleiben inszeniert (Index). git reset --mixed (Standard): Änderungen aufheben + Änderungen aufheben, Änderungen bleiben im Arbeitsbaum. git reset --hard: nicht festschreiben + aufheben + Änderungen löschen, nichts mehr übrig.
NattyC
6

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

Sachchidanand Singh
quelle
5

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 verwenden git 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

LostMohican
quelle