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?


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:


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.