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
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
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
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
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
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
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
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:
- sklonowano repozytorium (klon git)
- przełączono na gałąź dev (git checkout dev)
- zrobiłem kilka commitów (git commit -m "commit 1")
- 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