Jaka jest różnica między „git checkout -f” a „git reset --hard HEAD”?

81

Muszę cofnąć lokalne zmiany dla wdrożeń. ( svn revertUżywałem tego w czasach starego szkoły SVN.)

I używam git reset --hard HEADdo tego. (Również git fetchi git merge origin/$branch --no-ffdo synchronizacji z odgałęzieniem upstream.)

Ale niektóre artykuły wskazują git checkout -fna cofnięcie zmian.

Jakie są kluczowe różnice między tymi poleceniami. Który sposób jest zalecany?

osm
źródło

Odpowiedzi:

64

Obaj mają dokładnie ten sam efekt. Polecam Ci wybrać takie rozwiązanie, które będzie dla Ciebie wygodniejsze.

Ale gdyby w tym konkretnym przypadku efekt był taki sam, przy różnych wartościach byłby zupełnie inny. Zasadniczo (jest więcej, zobacz powiązane tematy) z resetem przenosisz bieżącą gałąź i HEAD do określonego zatwierdzenia, ale przy kasie przesuwasz tylko HEAD. Więcej informacji znajduje się poniżej.


Zasoby:

Na ten sam temat:

Colin Hebert
źródło
13

Nie mam jeszcze przedstawiciela do komentowania innych odpowiedzi, chciałem tylko dodać, że natknąłem się na przypadek, w którym dwie komendy NIE dają tego samego efektu. Wpadłem w dziwny stan, więc jest to zdecydowanie skrajny przypadek. Oto, co się stało:

Byłem w gałęzi, wszystko czyste. Sprawdziłem wzorzec git checkout masteri stwierdziłem git status, że w istniejących plikach nie zostały wprowadzone zmiany (tak, w kodzie, który właśnie wypisałem). Próbowałem schować, aby wrócić do czystego stanu, skrytka rzekomo ukończona, ale git statusnadal nie została zmieniona. Próbowałem też git reset --hard HEAD. To również zgłosiło pomyślne ukończenie, ale status nie był inny. Nie mogłem przerwać tych dziwnych zmian.

Jednak git checkout -frozwiązałem ten problem. Udało mi się uciec z tego dziwnego stanu. Tak więc, przynajmniej w pewnym sensie, te dwie rzeczy nie są takie same.

user1807768
źródło
Właśnie miałem dokładnie taką samą sytuację. Było kilka zmodyfikowanych plików, które resetowały git - hard HEAD nie zniknął, ale git checkout -f tak, więc wyraźnie nie są takie same na pewnym poziomie.
Mike Wasson
1
W naszym przypadku było to spowodowane zmianą uprawnień do plików; to naprawiło stackoverflow.com/questions/1257592/ ...
Mike Wasson
2
Możesz również napotkać ten problem, jeśli ustawienia zakończenia linii git są nieco pomieszane i próbuje je przekonwertować przy kasie.
Simon East