Was ist der Unterschied zwischen "git checkout -f" und "git reset --hard HEAD"?

80

Ich muss lokale Änderungen für Bereitstellungen zurücksetzen. (Ich hatte svn revertdies in alten Skool-SVN-Tagen verwendet.)

Und ich benutze git reset --hard HEADdafür. (Auch git fetchund git merge origin/$branch --no-ffzum Synchronisieren mit dem Upstream-Zweig.)

Einige Artikel weisen jedoch darauf hin, git checkout -fdass Änderungen rückgängig gemacht werden.

Was sind die Hauptunterschiede zwischen diesen Befehlen? Welcher Weg wird empfohlen?

osm
quelle

Antworten:

63

Die beiden haben genau den gleichen Effekt. Ich empfehle Ihnen, die Lösung zu wählen, mit der Sie sich am wohlsten fühlen.

Aber wenn in diesem speziellen Fall der Effekt der gleiche ist, mit unterschiedlichen Werten, wäre er völlig unterschiedlich. Grundsätzlich (es gibt mehr, siehe verknüpfte Themen) verschieben Sie mit einem Reset den aktuellen Zweig und den HEAD in ein bestimmtes Commit, aber mit einem Checkout verschieben Sie nur den HEAD. Weitere Details siehe unten.


Ressourcen:

Zum gleichen Thema:

Colin Hebert
quelle
13

Ich habe noch nicht die Möglichkeit, andere Antworten zu kommentieren. Ich wollte nur hinzufügen, dass ich auf einen Fall gestoßen bin, in dem die beiden Befehle NICHT den gleichen Effekt haben. Ich bin in einen seltsamen Zustand geraten, also ist dies definitiv ein Randfall. Folgendes ist passiert:

Ich war in einer Filiale, alles sauber. Ich habe den Master ausgecheckt git checkout masterund festgestellt, git statusdass Änderungen an vorhandenen Dateien vorgenommen wurden, die nicht für ein Commit bereitgestellt wurden (ja, für den Code, den ich gerade ausgecheckt habe). Ich habe versucht, mich zu verstecken, um in einen sauberen Zustand zurückzukehren. Der Stash soll abgeschlossen sein, war aber git statusimmer noch unverändert. Auch versucht git reset --hard HEAD. Es wurde ebenfalls ein erfolgreicher Abschluss gemeldet, der Status war jedoch nicht anders. Ich konnte diese seltsamen Änderungen nicht abbrechen.

Dies wurde jedoch git checkout -fgelöst. Ich konnte diesem seltsamen Zustand entkommen. Zumindest in gewisser Hinsicht sind die beiden also nicht gleich.

user1807768
quelle
Ich hatte genau die gleiche Situation. Es gab eine Reihe von modifizierten Dateien, die git zurückgesetzt haben - hard HEAD würde nicht verschwinden lassen, aber git checkout -f hat es getan, also sind sie auf einer bestimmten Ebene eindeutig nicht gleich.
Mike Wasson
1
In unserem Fall war dies auf die Änderung der Dateiberechtigungen zurückzuführen. dies behoben es stackoverflow.com/questions/1257592/…
Mike Wasson
2
Möglicherweise tritt dieses Problem auch auf, wenn Ihre Einstellungen für das Ende der Git-Zeile etwas durcheinander sind und versucht wird, diese beim Auschecken zu konvertieren.
Simon East