Jak cofnąć niezatwierdzone zmiany, w tym pliki i foldery?

1071

Czy istnieje polecenie git, aby przywrócić wszystkie niezatwierdzone zmiany w działającym drzewie i indeksie, a także usunąć nowo utworzone pliki i foldery?

MEM
źródło
1
Możliwy duplikat Jak odrzucić niestabilne zmiany w Git?
vusan
1
Cóż, przeczytałem wszystkie różnorodne i trudne do zapamiętania odpowiedzi poniżej, z ich zastrzeżeniami i przypadkami na krawędzi i „nie działały, jeśli masz xxx”, i utknąłem w usuwaniu całego repozytorium, klonując go, aby usunąć wszystkie edytowane i dodane pliki . To także tylko dwa polecenia. rm -r projectdir; git clone xxx. Dla mnie jest to częsta operacja - sprawdź grę z repozytorium, a następnie chcę wrócić do czystej kasy, aby rozpocząć modyfikację. Nie wspaniale, ale działa w 100%. Mając nadzieję, że pewnego dnia dodadzą do tego proste polecenie.
John Little,

Odpowiedzi:

1771

Możesz uruchomić te dwa polecenia:

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd
htanata
źródło
147
dobrym pomysłem jest uruchomienie „git clean -nd”, aby wyświetlić podgląd zmian przed uruchomieniem git clean, aby upewnić się, że nie zostaną usunięte pliki lub katalogi, które są dla Ciebie ważne.
jpw
79
Zapisz komuś wycieczkę do dokumentacji: -f to siła, -d usuwa katalogi, -n to bieg próbny (także - sucho bieg; pokaż wyjście bez robienia czegokolwiek)
Aaron Campbell
12
git clean -idla trybu interaktywnego.
galath,
Nie zresetował moich nieustawionych plików, musiałem je najpierw wystawić.
Aron Lorincz
4
@IgorGanapolsky Prawdopodobnie jesteś w trakcie konfliktu scalania. Spróbuj uruchomić git merge --abort.
htanata
555

Jeśli chcesz przywrócić zmiany tylko w bieżącym katalogu roboczym, użyj

git checkout -- .

A przedtem możesz wyświetlić listę plików, które zostaną przywrócone bez podejmowania żadnych działań, aby sprawdzić, co się stanie, za pomocą:

git checkout --
Ramashish Baranwal
źródło
1
Gdy próbuję, pojawia się komunikat „error: pathspec”. ” nie pasuje do żadnego pliku (ów) znanego z git
Mike K
34
jaka jest różnica między tym a git reset --hard?
Felipe Almeida,
104
„git reset --hard” spowoduje cofnięcie zmian zarówno etapowych, jak i nieetapowych, natomiast „git checkout -.” cofnie tylko
niestopniowe
Ale jeśli użyjesz kasy i zmodyfikujesz pliki, polecenie cmd zwróci, że muszę wykonać scalenie, nawet jeśli po prostu muszę cofnąć te zmiany
Vinicius Monteiro,
7
git checkout - po prostu wyświetli listę plików, które zostaną cofnięte (bez akcji, tylko lista). jest to przydatne, jeśli chcesz zobaczyć, na jakie pliki wpłynie to przed wykonaniem polecenia git -.
Krish Srinivasan
107

Użyj „git checkout - ...”, aby odrzucić zmiany w katalogu roboczym

git checkout -- app/views/posts/index.html.erb

lub

git checkout -- *

usuwa wszystkie zmiany dokonane w plikach niestacjonarnych o statusie git np

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb
Zarne Dravitzki
źródło
5
git checkout -- *nie działa dla mnie, chyba że jestem w katalogu, w którym znajdują się zmienione pliki. Aby pobrać wszystkie pliki z całego repozytorium, musisz to zrobićgit checkout -- :/
waldyrious,
W git checkout -- *, gwiazda jest zastąpiona przez powłokę, ze wszystkimi plikami i katalogami w bieżącym katalogu. Więc powinien przejść do podkatalogów. Mi to pasuje. Ale dzięki podkreśleniu składni „: /”, która moim zdaniem wydaje się czystsza.
mcoolive
53

Jednym nietrywialnym sposobem jest uruchomienie tych dwóch poleceń:

  1. git stash Spowoduje to przeniesienie zmian do skrytki i powrót do stanu HEAD
  2. git stash drop Spowoduje to usunięcie najnowszej skrytki utworzonej w ostatnim poleceniu.
ponury
źródło
3
Nie działa to w przypadku niezatwierdzonych zmian, tylko zatwierdzone zmiany.
b0xxed1n
4
Użyłem go do niezaangażowanych zmian i działa.
Paul D. Eden,
7
@ b0xxed1n Stashing polega na niezatwierdzonych zmianach i oczywiście działa na nie.
TJ
git stash został stworzony, aby zapisać niezaangażowane zmiany, abyś mógł ... zapisać je bez popełniania.
Rob
git stash powoduje następujący błąd:fatal: git-write-tree: error building trees Cannot save the current index state
IgorGanapolsky
19
git clean -fd

nie pomogło, pozostały nowe pliki. To, co zrobiłem, to całkowite usunięcie całego działającego drzewa, a następnie

git reset --hard

Zobacz „ Jak wyczyścić mój lokalny katalog roboczy w git? ”, Aby uzyskać porady dotyczące dodania -xopcji czyszczenia:

git clean -fdx

Uwaga -x flaga usunie wszystkie pliki ignorowane przez Git, więc bądź ostrożny (zobacz dyskusję w odpowiedzi, do której się odwołuję).

Fr0sT
źródło
co to jest -fdx? „force, directory i x jest?
Adi Prasetyo 30.04.16
Flaga @AdiPrasetyo -x usuwa również wszystkie ignorowane pliki; może to być niepożądany efekt, więc zaktualizowałem swoją odpowiedź.
Fr0sT
Nadal nie mogę bazować. Pojawia się błąd: błąd: nie można scalić zmian. Poprawka nie powiodła się o 0003 Utwórz wywołanie zwrotne do Nieudana kopia łatki znajduje się w:
IgorGanapolsky
13

Myślę, że możesz użyć następującego polecenia: git reset --hard

Josnidhin
źródło
hhmm ... Zrobiłem to, ale moje pliki wciąż tam są. Czy powinienem coś zrobić później?
MEM
1
git reset przywraca tylko nieoczekiwane zmiany w działającym drzewie. Nie usunie nowych plików i folderów. Nie jestem pewien, jak to zrobić za pomocą git
Josnidhin
1
Więc jeśli zmienimy katalog systemowy poprzez dodanie nowych plików i folderów, a następnie chcemy przywrócić ten katalog do poprzedniego stanu (bez plików i folderów), nie możemy tego zrobić za pomocą git? Więc najlepiej, jak możemy przywrócić stany plików? Ale po utworzeniu pliku nie możemy go usunąć, chyba że zrobimy to ręcznie?
MEM,
6

Pamiętaj, że nadal mogą istnieć pliki, które nie wydają się znikać - mogą być nieedytowane, ale git mógł oznaczyć je jako edytowane z powodu zmian CRLF / LF. Sprawdź, czy ostatnio wprowadziłeś jakieś zmiany .gitattributes.

W moim przypadku dodałem ustawienia CRLF do .gitattributespliku i wszystkie pliki pozostały z tego powodu na liście „zmodyfikowanych plików”. Zmiana ustawień atrybutów git spowodowała, że ​​zniknęły.

Obrabować
źródło
6

Jeśli masz niezatwierdzoną zmianę (tylko w kopii roboczej), którą chcesz przywrócić do kopii w ostatnim zatwierdzeniu, wykonaj następujące czynności:

git checkout filename
kgandroid
źródło
Próbuję tego po niezamierzonym git rm filenamei to nie działa. error: pathspec 'filename' did not match any file(s) known to git.
falsePockets
Rozwiązaniem dla cofania git rmjestgit checkout master -- filename
falsePockets
3

Git 2.23 wprowadził git restorepolecenie przywracania działających plików drzewa.

https://git-scm.com/docs/git-restore

Aby przywrócić wszystkie pliki w bieżącym katalogu

przywróć git.

Jeśli chcesz przywrócić wszystkie pliki źródłowe C w celu dopasowania do wersji w indeksie, możesz to zrobić

git restore '* .c'

TheKojuEffect
źródło
1
to git 2.23 , a nie 2.13
phuclv
2

Możesz po prostu użyć następującego polecenia git, które może przywrócić wszystkie niezatwierdzone zmiany dokonane w repozytorium:

git checkout .

Przykład:

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   application/controllers/Drivers.php
        modified:   application/views/drivers/add.php
        modified:   application/views/drivers/load_driver_info.php
        modified:   uploads/drivers/drivers.xlsx

no changes added to commit (use "git add" and/or "git commit -a")

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git checkout .

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean
Haritsinh Gohil
źródło
-2

Zwykle używam tego sposobu, który działa dobrze:

mv fold/file /tmp
git checkout fold/file
thinkhy
źródło
To jest dokładnie to samo, co zaproponował facet z 357 „polubień”. Tyle, że nawet tworzysz kopię zapasową nowo pobranego pliku.
Matthias
-3

Bezpieczna i długa droga:

  1. git branch todelete
  2. git checkout todelete
  3. git add .
  4. git commit -m "I did a bad thing, sorry"
  5. git checkout develop
  6. git branch -D todelete
Jason Lemay
źródło
-3

Posługiwać się:

git reset HEAD filepath

Na przykład:

git reset HEAD om211/src/META-INF/persistence.xml
Aniket
źródło