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

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

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

git reset --hard HEAD
Author: shekhar, 2009-07-18

12 answers

Jeśli chcesz przywrócić zmiany wprowadzone do kopii roboczej, zrób to:

git checkout .

Jeśli chcesz przywrócić zmiany wprowadzone do indeksu (np. które dodałeś), zrób to. Uwaga, spowoduje to zresetowanie wszystkich Twoich commitów do mistrza!:

git reset

Jeśli chcesz przywrócić zmianę, którą popełniłeś, zrób to:

git revert <commit 1> <commit 2>

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

git clean -f

Lub nie śledzonych katalogów (np. nowych lub automatycznie generowane katalogi):

git clean -fd
 2877
Author: 1800 INFORMATION,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-09 11:50:38

Uwaga: Możesz również uruchomić

git clean -fd

Jako

git reset --hard

Nie usunie pliki nie śledzone, gdzie jako git-clean usunie wszystkie pliki ze śledzonego katalogu głównego, które nie znajdują się w git tracking. UWAGA-OSTROŻNIE Z TYM! Warto najpierw uruchomić dry-run z git-clean, aby zobaczyć, co spowoduje usunięcie.

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

~"performing this command will cause an un-tracked file to be overwritten"
Które mogą wystąpić podczas wykonywania kilku czynności. jedną z nich jest aktualizacja kopia robocza, gdy ty i twój znajomy dodaliście nowy plik o tej samej nazwie, ale on wpierw włączył go do kontroli źródła, a ty nie dbasz o usunięcie Niezabezpieczonej kopii.

W tej sytuacji wykonanie suchego uruchomienia pomoże również wyświetlić listę plików, które zostaną nadpisane.

 339
Author: Antony Stubbs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-16 06:53:24

Jeśli chcesz przywrócić wszystkie zmiany i być na bieżąco z bieżącym zdalnym master (na przykład zauważysz, że głowica master przesuwa się do przodu od czasu, gdy ją rozgałęziłeś i twoje push jest 'odrzucane'), 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.
 65
Author: Michael Durrant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-22 20:48:23

Re-clone

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  • usuwa lokalne, nie popychane commity
  • przywraca zmiany wprowadzone w śledzonych plikach
  • przywraca śledzone pliki, które usunąłeś
  • usuwa pliki / dirs wymienione w .gitignore (Jak pliki kompilacji)
  • usuwa pliki / dirs, które nie są śledzone i nie są w .gitignore
  • Nie zapomnisz tego podejścia
  • marnuje przepustowość

Oto inne polecenia, o których codziennie zapominam.

Czyste i reset

git clean -f -d -x
git reset --hard
  • usuwa lokalne, nie popychane commity
  • przywraca zmiany wprowadzone w śledzonych plikach
  • przywraca śledzone pliki, które usunąłeś
  • usuwa pliki / dirs wymienione w .gitignore (Jak pliki kompilacji)
  • usuwa pliki / dirs, które nie są śledzone i nie są w .gitignore

Clean

git clean -f -d -x
  • usuwa lokalne, nie popychane commity
  • przywraca zmiany wprowadzone w śledzonych plikach
  • przywraca śledzone pliki deleted
  • usuwa pliki / dirs wymienione w .gitignore (Jak pliki kompilacji)
  • usuwa pliki / dirs, które nie są śledzone i nie są w .gitignore

Reset

git reset --hard
  • usuwa lokalne, nie popychane commity
  • przywraca zmiany wprowadzone w śledzonych plikach
  • przywraca śledzone pliki, które usunąłeś
  • usuwa pliki / dirs wymienione w .gitignore (Jak pliki kompilacji)
  • usuwa pliki / dirs, które nie są śledzone i nie są w .gitignore

Uwagi

Przypadek testowy potwierdzający wszystkie powyższe (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 commity, które cofają poprzednie commity
  • git checkout aby cofnąć się w czasie do wcześniejszych commitów (może wymagać najpierw uruchomienia powyższych komend)
  • git stash to samo co git reset powyżej, ale możesz to cofnąć
 55
Author: William Entriken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-10 15:27:00

Zajrzyj do git-reflog. Wyświetli listę wszystkich stanów, które pamięta (domyślnie jest to 30 dni), a Ty możesz po prostu wymeldować 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
Author: William Pursell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-21 12:53:04

Niebezpieczeństwo przed nami: (proszę przeczytać komentarze. Wykonanie polecenia zaproponowanego w mojej odpowiedzi może usunąć więcej niż chcesz)

Aby całkowicie usunąć wszystkie pliki łącznie z katalogami musiałem uruchomić

git clean -f -d
 34
Author: Tobias Gassmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-28 08:43:23

Po przeczytaniu kilku odpowiedzi i wypróbowaniu ich, znalazłem różne przypadki krawędzi, które oznaczają, że czasami nie czyszczą w pełni kopii roboczej.

Oto mój obecny skrypt bash do robienia tego, który działa cały czas.

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

Uruchom z katalogu głównego working copy.

 34
Author: Scott Davey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-04 07:25:46

Po Prostu powiedz

git stash

Usunie wszystkie lokalne czagi. możesz również użyć później, mówiąc

git stash apply 
 31
Author: piyushmandovra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-24 12:18:07

Spotkałem się z podobnym problemem. Rozwiązaniem jest użycie git log, aby sprawdzić, która wersja Local commit różni się od zdalnego. (Np. wersja to 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Następnie użyj git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec, aby cofnąć zmianę.

 26
Author: Patrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-05 15:07:41

Może niekoniecznie chcesz / Musisz trzymać swoje prace / pliki w katalogu roboczym, ale zamiast tego po prostu pozbądź się ich całkowicie. Polecenie git clean zrobi to za Ciebie.

Niektóre typowe przypadki użycia to usunąć cruft , który został wygenerowany przez merge lub zewnętrzne narzędzia lub usunąć inne pliki, aby można było uruchomić czystą kompilację.

Pamiętaj, że będziesz chciał być bardzo ostrożny z tym poleceniem, ponieważ jego przeznaczeniem jest usuwanie plików z twojego lokalny katalog roboczy, który nie jest śledzony. jeśli suddently zmienić zdanie po wykonaniu tego polecenia, nie ma powrotu, aby zobaczyć zawartość plików, które zostały usunięte. Alternatywą, która jest bezpieczniejsza, jest wykonanie

git stash --all

Który usunie wszystko, ale zapisze wszystko w schowku. Ten schowek można później wykorzystać.

Jednakże, jeśli 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 podkatalogów, które nie mają żadnych pozycji w wyniku polecenia. Przed wykonaniem polecenia git clean -f -d należy wykonać polecenie

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 agresywnych do najmniej agresywnych


Opcja 1: Usuń wszystkie pliki lokalnie (Większość aggressive)

git clean -f -d

Opcja 2 : podgląd powyższego uderzenia (podgląd najbardziej agresywny)

git clean -f -d -n

Opcja 3 : Schowaj wszystkie pliki (najmniej agresywne)

`git stash --all` 
 6
Author: joey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-14 22:37:26

Szukałem podobnego problemu,

Chciał wyrzucić lokalne commity:

  1. sklonowano repozytorium (git clone)
  2. switched to dev branch (git checkout dev)
  3. czy kilka commitów (git commit-m "commit 1")
  4. ale postanowiłem wyrzucić te lokalne commity, aby wrócić do remote (origin/dev)

Tak samo jak poniżej:

git reset --hard origin/dev

Sprawdzić:

git status  

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

Teraz lokalne commity są tracone, z powrotem do początkowego stanu klonowania, pkt 1 powyżej.

 6
Author: Manohar Reddy Poreddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-25 10:03:34

Spróbuj przywrócić wszystkie zmiany niezatwierdzone w lokalnej gałęzi

$ git reset --hard HEAD

Ale jeśli widzisz taki błąd:

fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.

Możesz przejść do '.folder git ' a następnie usuń indeks.plik blokady:

$ cd /directory/for/your/project/.git/
$ rm index.lock

Na koniec uruchom ponownie polecenie:

$ git reset --hard HEAD
 5
Author: Janderson Silva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-03 12:49:58