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
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
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.
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.
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 cogit reset
powyżej, ale możesz to cofnąć
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
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
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.
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
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ę.
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`
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:
- sklonowano repozytorium (git clone)
- switched to dev branch (git checkout dev)
- czy kilka commitów (git commit-m "commit 1")
- 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.
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
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