Jak przywrócić wszystkie lokalne zmiany w projekcie zarządzanym przez Git do poprzedniego stanu?

Mam projekt, w którym uruchomiłem git init. Po kilku commitach, zrobiłem git status, który powiedział mi, że wszystko jest aktualne i nie ma żadnych lokalnych zmian.

Następnie dokonałem kilku kolejnych zmian i zdałem sobie sprawę, że chcę wszystko wyrzucić i wrócić do pierwotnego stanu. Czy ta komenda zrobi to za mnie?

git reset --hard HEAD
Rozwiązanie

Jeśli chcesz przywrócić zmiany wprowadzone w kopii roboczej, wykonaj tę czynność:

git checkout .

Jeśli chcesz odwrócić zmiany dokonane w indeksie (tzn. dodane przez ciebie), zrób to. Ostrzeżenie: spowoduje to zresetowanie wszystkich twoich nieopublikowanych commitów do wersji master!:

git reset

Jeśli chcesz odwrócić zmiany, które popełniłeś, zrób to:

git revert  

Jeśli chcesz usunąć nieśledzone pliki (np. nowe pliki, wygenerowane pliki):

git clean -f

Lub nieśledzone katalogi (np. nowe lub automatycznie wygenerowane katalogi):

git clean -fd
Komentarze (19)

Uwaga: Możesz również uruchomić

git clean -fd

jako

git reset --hard

nie usunie nieśledzonych plików, gdzie git-clean usunie wszystkie pliki ze śledzonego katalogu głównego, które nie są śledzone przez git. OSTRZEŻENIE - BĄDŹ Z TYM OSTROŻNY! Pomocne jest, aby najpierw uruchomić suchy przebieg z git-clean, aby zobaczyć, co usunie.

Jest to również szczególnie przydatne, gdy otrzymasz komunikat o błędzie

~"performing this command will cause an un-tracked file to be overwritten"

Który może wystąpić podczas robienia kilku rzeczy, jedną z nich jest aktualizacja kopii roboczej, gdy ty i twój przyjaciel dodaliście nowy plik o tej samej nazwie, ale on'popełnił go do kontroli źródła jako pierwszy, a ty nie dbasz o usunięcie swojej niezaufanej kopii.

W tej sytuacji, wykonanie uruchomienia na sucho pomoże również pokazać listę plików, które zostałyby nadpisane.

Komentarze (4)

Zajrzyj do git-reflog. Wyświetli on listę wszystkich stanów, które pamięta (domyślnie 30 dni), a ty możesz po prostu sprawdzić ten, który chcesz. Na przykład:

$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d
Komentarze (4)