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


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

Potem zrobiłem kilka kolejnych zmian i uświadomiłem sobie, że chcę wszystko wyrzucić i powrócić do stanu pierwotnego. Czy to polecenie zrobi to za mnie?

git reset --hard HEAD

1549
2017-07-18 07:52


pochodzenie




Odpowiedzi:


Jeśli chcesz przywrócić zmiany wprowadzone w kopii roboczej, wykonaj następujące czynności:

git checkout .

Jeśli chcesz przywrócić zmiany wprowadzone w indeksie (tzn. Dodałeś), zrób to. Ostrzeżenie to zresetuje wszystkie twoje niewzruszone zatwierdzenia do opanowania!:

git reset

Jeśli chcesz cofnąć wprowadzoną zmianę, wykonaj następujące czynności:

git revert <commit 1> <commit 2>

Jeśli chcesz usunąć niepotwierdzone pliki (np. Nowe pliki, wygenerowane pliki):

git clean -f

Lub nieśledzone katalogi (np. Nowe lub automatycznie generowane katalogi):

git clean -fd

2821
2017-07-18 07:57



fwiw po tak długim czasie, git checkout path/to/file przywróci tylko lokalne zmiany path/to/file - Matijs
+1 na poniższych odpowiedziach również wspominając git clean -f (aby usunąć zmiany nieśledzone) i -fd (aby również usunąć nieśledzone katalogi) - ptdev
a jeśli chcesz również wyczyścić swoje nieśledzone pliki, przeczytaj to stackoverflow.com/questions/61212/... - Surasin Tancharoen
git checkout . i git reset [--hard HEAD] nie działa, musiałem zrobić git clean -fd aby przywrócić moje zmiany. - BrainSlugs83
git reset nie resetuje twoich zmian, git reset --hard robi to. - Cerin


Uwaga: możesz również chcieć uruchomić

git clean -fd

tak jak

git reset --hard

będzie nie usuń niepotwierdzone pliki, gdzie jak git-clean usunie wszystkie pliki ze śledzonego katalogu głównego, które nie są śledzone przez git. OSTRZEŻENIE - BĄDŹ OSTROŻNY! Pomocne jest, aby najpierw uruchomić tryb "dry-run" z git-clean, aby zobaczyć, co zostanie usunięte.

Jest to szczególnie przydatne, gdy pojawi się komunikat o błędzie

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

Co może się zdarzyć podczas robienia kilku rzeczy, z których jedna polega na aktualizacji kopii roboczej, kiedy zarówno ty, jak i twój znajomy dodaliście nowy plik o tej samej nazwie, ale najpierw przekazał go do kontroli kodu źródłowego, a nie obchodzi go usunięcie skasowanej kopii .

W tej sytuacji wykonanie "suchego biegu" również pomoże ci pokazać listę plików, które zostaną nadpisane.


334
2017-07-20 05:37



Polecenie czyszczenia pliku to "git clean -f". Untrackowane katalogi są usuwane za pomocą "git clean -d" - Jonathan Mitchell
git clean -fd (wymuszenie jest wymagane dla -d) - electblake
-n lub --dry-run są flagami do pracy na sucho. - stephenbez
git clean -ffd, jeśli masz inne repozytorium git w swoim repozytorium git. Bez podwójnego f nie zostałby usunięty. - Trismegistos


Jeśli chcesz przywrócić wszystkie zmiany I być na bieżąco z bieżącym zdalnym wzorcem (na przykład, zauważysz, że mistrz HEAD posunął się naprzód, odkąd go rozgałęziłeś, a twoje naciśnięcie zostało "odrzucone"), możesz użyć

git fetch  # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.

59
2018-04-22 20:48





Zajrzyj do git-reflog. Spowoduje to wyświetlenie wszystkich stanów, które pamięta (domyślnie jest to 30 dni), i możesz po prostu wykupić 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

47
2017-07-19 12:16



dzięki za tonę William, za git reflog. Zresetowałem swoje drzewo do starej wersji i nie wiem, jak wrócić do najnowszej wersji. twój refren git mnie uratował. Jeszcze raz dziękuję. - palaniraja
też mnie uratował! W moim przypadku moja przygoda z git rebase -i poszło nie tak (w końcu usunęło kilka błędów z powodu błędu edycji). Dzięki tej wskazówce wróciłem w dobrym stanie! - paneer_tikka
Co masz na myśli przez 30 dni domyślnych! - Mohe TheDreamy
@MoheTheDreamy Mam na myśli, że istnieje limit czasu. Ostatecznie śmieciarz usunie nieosiągalne referencje, gdy ich wiek przekroczy ten limit. Wartością domyślną była (i być może nadal jest) 30 dni. Więc starsze referencje mogą być niedostępne. - William Pursell


Odtworzyć ponownie

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  •  Usuwa lokalne, nieprzesłane zatwierdzenia
  •  Przywraca zmiany dokonane w śledzonych plikach
  •  Przywraca śledzone pliki usunięte
  •  Usuwa pliki / katalogi wymienione w .gitignore (jak pliki kompilacji)
  •  Usuwa pliki / katalogi, które nie są śledzone i nie są dołączone .gitignore
  •  Nie zapomnisz tego podejścia
  •  Marnuje przepustowość

Poniżej znajdują się inne polecenia, które codziennie zapominam.

Oczyść i zresetuj

git clean -f -d -x
git reset --hard
  •  NIE usuwa lokalnych, nieprzesłanych zatwierdzeń
  •  Przywraca zmiany dokonane w śledzonych plikach
  •  Przywraca śledzone pliki usunięte
  •  Usuwa pliki / katalogi wymienione w .gitignore (jak pliki kompilacji)
  •  Usuwa pliki / katalogi, które nie są śledzone i nie są dołączone .gitignore

Czysty

git clean -f -d -x
  •  NIE usuwa lokalnych, nieprzesłanych zatwierdzeń
  •  NIE odwraca zmian dokonanych w śledzonych plikach
  •  NIE przywraca usuniętych plików
  •  Usuwa pliki / katalogi wymienione w .gitignore (jak pliki kompilacji)
  •  Usuwa pliki / katalogi, które nie są śledzone i nie są dołączone .gitignore

Nastawić

git reset --hard
  •  NIE usuwa lokalnych, nieprzesłanych zatwierdzeń
  •  Przywraca zmiany dokonane w śledzonych plikach
  •  Przywraca śledzone pliki usunięte
  •  Usuwa pliki / katalogi wymienione w .gitignore (jak pliki kompilacji)
  •  NIE usuwa plików / katalogów, które nie są śledzone i nie są dołączone .gitignore

Uwagi

Przypadek testowy dla potwierdzenia wszystkich powyższych (użyj bash lub sh):

mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
git add .
git commit -m 'Initial checkin'
echo 'NEW FEATURE' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo 'CODE' > 'd.sourceCode'

Zobacz też

  • git revert aby wprowadzić nowe zatwierdzenia, które cofają wcześniejsze zatwierdzenia
  • git checkout cofnąć się w czasie do wcześniejszych zatwierdzeń (może wymagać wcześniejszego uruchomienia poleceń powyżej)
  • git stash taki sam jak git reset powyżej, ale możesz go cofnąć

41
2018-03-20 12:37



Przepraszamy za kradzież z powyższych odpowiedzi. Używam tego odniesienia stale, publikując głównie dla mnie. - William Entriken
Jestem prawie pewien, że pierwsza opcja (Odtworzyć ponownie) faktycznie "usuwa lokalne, nieprzesłane zatwierdzenia" :) - Marandil
Co oznacza czerwony znak X i zielony znacznik wyboru? Czy czerwony X neguje zdanie obok? - styfle
@styfle to coś, co robi, jest czymś, czego nie robi - William Entriken
@FullDecent To trochę zagmatwane do przeczytania. "NIE usuwa lokalnych, nieprzesłanych zatwierdzeń". Oznacza to, że NIE usuwa. Podwójne negatywne oznacza, że ​​usuwa? - styfle


NIEBEZPIECZEŃSTWO NA ZEWNĄTRZ: (przeczytaj komentarze. Wykonanie polecenia zaproponowanego w mojej odpowiedzi może usunąć więcej, niż chcesz)

całkowicie usunąć wszystkie pliki, w tym katalogi, które musiałem uruchomić

git clean -f -d

34
2017-09-11 07:10



Aby uratować każdy ból, który właśnie przeszedłem: spowoduje to również usunięcie plików .gitignore-d! - landons
Przepraszam, jeśli przysporzyłem ci kłopotów. Wtedy próbowałem po prostu przywrócić i usunąć wszystko w tym folderze. Nie pamiętam dokładnie okoliczności, ale "-d" było jedyną rzeczą, która dla mnie pracowała. Mam nadzieję, że nie sprawiłem Ci zbyt dużego bólu :-) - Tobias Gassmann
żadna krzywda. Miałem kopie zapasowe, ale to prawdopodobnie gwarantuje zrzeczenie się;) - landons


Po przeczytaniu kilku odpowiedzi i wypróbowaniu ich, znalazłem różne przypadki skrajne, które oznaczają, że czasami nie w pełni oczyszczają kopię roboczą.

Oto mój obecny skrypt basha, który działa przez cały czas.

#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD

Uruchom z katalogu głównego kopii roboczej.


34
2018-06-04 07:25



Ostatnie polecenie daje mi error: pathspec 'HEAD' did not match any file(s) known to git. - 0xC0000022L
To zadziałało, kiedy wyjąłem "-". git checkout HEAD - Jester
git reset --hard przywraca śledzone pliki (wystawiane lub nie), git clean -f -d usuwa niepobrane pliki, git checkout -- HEAD dlaczego potrzebujemy tego? - v.shashenko
Nie potrzebujemy podwójnego łącznika. To musi być literówka. - Farax


po prostu powiedz

git stash

usunie wszystkie lokalne klany. możesz także użyć później, mówiąc

git stash apply 

29
2018-04-24 12:18



posługiwać się git stash pop automatycznie usunie dla ciebie najwyższą zmianę ukrytą - Arrow Cen
git stash drop aby usunąć najnowszy stan przechowywania bez zastosowania do kopii roboczej. - deerchao


Spotkałem podobny problem. Rozwiązaniem jest użycie git log aby sprawdzić, która wersja lokalnego zatwierdzenia różni się od zdalnego. (Np. Wersja jest 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Następnie użyj git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec aby przywrócić zmianę.


26
2017-08-28 07:34





Niekoniecznie chcesz / musisz przechować swoją pracę / pliki w katalogu roboczym, ale zamiast tego po prostu pozbyć się ich całkowicie. Komenda git clean zrobię to za Ciebie.

Jednym z typowych przypadków użycia tego byłoby: usuń cruft który został wygenerowany przez scalenie lub zewnętrzne narzędzia lub usunąć inne pliki, aby można było uruchomić czystą kompilację.

Pamiętaj, że będziesz bardzo ostrożny przy tym poleceniu, ponieważ jego celem jest usunięcie plików z twojego lokalnego katalogu roboczego, które NIE są ŚLEDZONE. jeśli nagle zmienisz zdanie po wykonaniu tego polecenia, nie będzie powrotu, aby zobaczyć zawartość usuniętych plików. Alternatywą, która jest bezpieczniejsza, jest wykonanie

git stash --all 

która usunie wszystko, ale zachowa wszystko w skrytce. Skrytkę można później wykorzystać.

Jeśli jednak naprawdę chcesz usunąć wszystkie pliki i wyczyścić katalog roboczy, powinieneś wykonać

git clean -f -d

Spowoduje to usunięcie wszystkich plików, a także wszelkich podkatalogów, które nie mają żadnych elementów w wyniku polecenia. Inteligentna rzecz do zrobienia przed wykonaniem git clean -f -d polecenie jest uruchamiane

git clean -f -d -n

który pokaże podgląd tego, co zostanie usunięte po wykonaniu git clean -f -d

Oto podsumowanie twoich opcji od najbardziej agresywnego do najmniej agresywnego


opcja 1: Usuń wszystkie pliki lokalnie (najbardziej agresywne)

git clean -f -d

Opcja 2: Podgląd powyższego wpływu (Podgląd najbardziej agresywny)

git clean -f -d -n

Opcja 3: Przechowuj wszystkie pliki (najmniej agresywne)

`git stash --all` 

6
2018-06-14 22:31





Szukałem podobnego problemu,

Chciałem wyrzucić lokalne zatwierdzenia:

  1. sklonowano repozytorium (klon git)
  2. przełączono na gałąź dev (git checkout dev)
  3. zrobiłem kilka commitów (git commit -m "commit 1")
  4. ale postanowił wyrzucić te lokalne zatwierdzenia, aby wrócić do zdalnego (origin / dev)

Podobnie jak poniżej:

git reset --hard origin/dev

Czek:

git status  

        On branch dev  
        Your branch is up-to-date with 'origin/dev'.  
        nothing to commit, working tree clean  

teraz lokalne zatwierdzenia są tracone, z powrotem do początkowego stanu sklonowanego, punkt 1 powyżej.


6
2018-02-25 10:03



dzięki kolego, to naprawiło mój problem - Nu-ONE