git: cofnij wszystkie działające zmiany katalogu, w tym nowe pliki

1151

Jak usunąć wszystkie zmiany z katalogu roboczego, w tym nowe nieśledzone pliki. Wiem, że to git checkout -frobi, ale nie usuwa nowych nieśledzonych plików utworzonych od ostatniego zatwierdzenia.

Czy ktoś ma pomysł, jak to zrobić?

Aler
źródło
1
@Joel & Wayfarer: dlaczego nie spróbować git help resetigit help clean
SHernandez
3
Utworzenie

Odpowiedzi:

1699
git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)

Aby zobaczyć, co zostanie wcześniej usunięte, bez faktycznego usuwania, użyj -nflagi (jest to w zasadzie test). Gdy będziesz gotowy do faktycznego usunięcia, usuń -nflagę:

git clean -nfd

BKSpurgeon
źródło
16
Uwaga: git reset --hard usuwa zmiany etapowe oraz zmiany katalogu roboczego. Ponadto git clean -f -d jest prawdopodobnie lepszym przeciwieństwem dodawania nowego pliku bez śledzenia. Z pytania pytający może być całkiem zadowolony z obecnego zestawu ignorowanych plików.
CB Bailey,
7
Przeczytaj następną odpowiedź i uważaj na przełącznik -x. (Może to również usunąć lokalną konfigurację, taką jak pliki haseł / ustawień db. Np. Database.yml)
Boris,
9
Ten przełącznik -x jest w tym przypadku niepotrzebny i nieco niebezpieczny.
Tim Gautier
66
git clean -fxdmoże być NAPRAWDĘ niebezpieczny, jeśli nie wiesz, co robisz. Może to spowodować trwałe usunięcie niektórych bardzo ważnych nieśledzonych plików, takich jak baza danych itp. Zachowaj ostrożność.
Mason Stewart
10
Pamiętaj, że git clean -f -dusunie także pliki z ignorowanych folderów. Więc wszystkie lokalne logi i tego typu rzeczy znikną. Zwykle nie jest to duży problem, ale lepiej wiedzieć.
cyriel
299

Najbezpieczniejsza metoda, z której często korzystam:

git clean -fd

Wyjaśnienie składni jak na /docs/git-cleanstronie:

  • -f(alias:) --force. Jeśli zmienna konfiguracyjna Git clean.requireForce nie jest ustawiona na wartość false, git clean odmówi usunięcia plików lub katalogów, chyba że podano -f, -n lub -i. Git odmówi usunięcia katalogów z podkatalogiem lub plikiem .git, chyba że podano drugie -f.
  • -d. Usuń nieśledzone katalogi oprócz nieśledzonych plików. Jeśli nieśledzony katalog jest zarządzany przez inne repozytorium Git, domyślnie nie jest usuwany. Użyj opcji -f dwa razy, jeśli naprawdę chcesz usunąć taki katalog.

Jak wspomniano w komentarzach, może być lepszym rozwiązaniem, git clean -ndktóry wykonuje próbę na sucho i mówi, co należy usunąć przed faktycznym usunięciem.

Link do git cleanstrony z dokumentami: https://git-scm.com/docs/git-clean

Heath Dutton
źródło
124
Zawsze git clean -nd .przed faktycznym usunięciem plików korzystałem zgit clean -fd .
tbear
14
Dlaczego? Czy możesz wyjaśnić szczegóły.
Greg B
31
Za git czystą opcją -n jest właściwie prowadzony suche, która nie usunąć niczego, po prostu pokazuje, co będzie zrobione.
RNickMcCandless
2
@tbear, Zawsze możesz zawsze zrobić puste add -A+ commit -a+ revert headwcześniej git clean. Przeglądanie każdego usunięcia po prostu nie jest skalowane w przypadku głównych scenariuszy. Również suchobieg nie jest srebrną kulą: co, jeśli coś przeoczyłeś lub popełniłeś błąd podczas przeglądu?
Pacerier,
1
Usuwa to pliki, ale nie przywraca modyfikacji.
donquixote
202

Do wszystkich plików niestacjonarnych użyj:

git checkout -- .

.Na końcu jest ważna.

Możesz zastąpić .nazwą podkatalogu, aby wyczyścić tylko określony podkatalog swojego projektu. Problem został rozwiązany właśnie tutaj .

jfountain
źródło
7
@Vincent: - pozwala uniknąć błędów podczas pisania, informując komendę kasy, że nie określono już żadnych parametrów. Bez nich możesz skończyć z nowym oddziałem zamiast resetu obecnego!
Igor Rodriguez
2
Jest to najbezpieczniejsza trasa, ale nie usuwa nieśledzonych plików (nowo dodanych plików).
TinkerTenorSoftwareGuy
5
To nie przywraca usuniętych, ale niezatwierdzonych plików.
Cerin
Po prostu dla ciebie. Tęskniłem za tym. Upewnij się, że znajdujesz się w katalogu, w którym chcesz usunąć nieustawione zmiany. Na przykład miałem zmiany w 2 różnych plikach w różnych lokalizacjach w oddziale, tj .: src/app/work/filename.jsi ../app/working/test/filename.js. Samo użycie git checkout -- .w gałęzi usunęło tylko pierwszy plik ( bez wiodącego ../ ). Musiałem więc przejść cd ../do drugiego katalogu lokalizacji, aby usunąć drugi plik za pomocą tego polecenia.
Chris22
57

Spójrz na git clean polecenie.

git-clean - Usuń nieśledzone pliki z działającego drzewa

Czyści drzewo robocze, rekurencyjnie usuwając pliki, które nie są pod kontrolą wersji, zaczynając od bieżącego katalogu.

Zwykle usuwane są tylko pliki nieznane git, ale jeśli podano opcję -x, pliki ignorowane są również usuwane. Może to być na przykład przydatne do usunięcia wszystkich produktów kompilacji.

Greg Hewgill
źródło
Próbowałem git clean -ii wybrałem „czyste” z menu - to w końcu usunęło nowe pliki.
Sany
42

Następujące prace:

git add -A .
git stash
git stash drop stash@{0}

Pamiętaj, że spowoduje to odrzucenie zarówno lokalnych, jak i tymczasowych zmian lokalnych. Dlatego przed uruchomieniem tych poleceń powinieneś zatwierdzić wszystko, co chcesz zachować.

Typowy przypadek użycia: przeniesiono wiele plików lub katalogów, a następnie chcesz wrócić do pierwotnego stanu.

Kredyty: https://stackoverflow.com/a/52719/246724

Don Kichot
źródło
1
Dlaczego odwołujesz się do skrytki @ {0} zamiast po prostu git stash drop?
maikel
Szczerze mówiąc, nie pamiętam :)
donquixote
Ten zadziałał. Uwaga: upewnij się, że znajdujesz się w katalogu domowym ( git add -A .). Straciłem 30 m, ponieważ nie było dopasowania pliku. Dzięki!
user9869932,
Kiedyś stosowałem to podejście i ma ono swoje zalety. Jednak od tego czasu odkryłem, że rozwiązania zaproponowane przez jfountain i Heath Dutton są bardziej odpowiednie dla pierwotnego problemu, IMHO.
HeyZiko,
2
git stash drop stash @ {0} upuszcza najnowszą skrytkę, jeśli zrobiłeś git stash, to
zrzuciłby
42

Możesz to zrobić w dwóch krokach:

  1. Cofnij zmodyfikowane pliki: git checkout -f
  2. Usuń nieśledzone pliki: git clean -fd
Gerard de Visser
źródło
3
+1, ponieważ proste. Również dlatego, że działa i robi dokładnie to, czego chce OP bez odstraszania ich za pomocą omg, spowoduje to usunięcie wszystkiego.
geekzster
30

Myślałem, że tak ( ostrzeżenie: usunięcie spowoduje wszystko )

$ git reset --hard HEAD
$ git clean -fd

The resetAby cofnąć zmiany. cleanCelu usunięcia untracked f iles i d irectories.

skube
źródło
To nie działa, wciąż dostaję ostrzeżenie o konflikcie podczas robienia git pullpóźniej: CONFLICT (content): Merge conflict in...Rozwiązałem to tylko przezgit pull --strategy=ours
rubo77
7
git reset --hard origin/{branchName}

Spowoduje to usunięcie wszystkich nieśledzonych plików.

Santosh Kumar
źródło
4

git clean -ipokaże najpierw elementy do usunięcia i kontynuuje po potwierdzeniu. Uważam to za przydatne w przypadku ważnych plików, których nie należy przypadkowo usuwać.

Zobacz git help cleanwięcej informacji, w tym kilka innych przydatnych opcji.

Tajga
źródło
4

Jeśli chcesz odrzucić wszystkie zmiany, możesz użyć dowolnej poprawnej opcji z aliasu w .gitconfig. Na przykład:

[alias]
    discard = "!f() { git add . && git stash && git stash drop stash@{0}; }; f"

Stosowanie: git discard

Agorreca
źródło
1
Ten alias bardzo mi się podoba
zaznacza
3

Alternatywnym rozwiązaniem jest zatwierdzenie zmian, a następnie pozbycie się tych zmian. Na początku nie ma to natychmiastowej korzyści, ale otwiera możliwość zatwierdzania fragmentów i tworzenia tagu git do tworzenia kopii zapasowych.

Możesz to zrobić w bieżącym oddziale, w następujący sposób:

git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git revert HEAD
git reset HEAD^^

Lub możesz to zrobić na odłączonym HEAD. (zakładając, że zaczynasz w gałęzi BRANCHNAME):

git checkout --detach HEAD
git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git checkout BRANCHNAME

Jednak zwykle robię to w kawałkach, a następnie nazywam niektóre lub wszystkie zatwierdzenia jako „ODRZUĆ: ...”. Następnie użyj interaktywnego rebase, aby usunąć złe zatwierdzenia i zachować dobre.

git add -p  # Add changes in chunks.
git commit -m"DISCARD: Some temporary changes for debugging"
git add -p  # Add more stuff.
git commit -m"Docblock improvements"
git tag archive/local-changes-2015-08-01
git rebase -i (commit id)  # rebase on the commit id before the changes.
  # Remove the commits that say "DISCARD".

Jest to bardziej szczegółowe, ale pozwala dokładnie sprawdzić, które zmiany chcesz odrzucić.

Te git loligit lola skróty zostały bardzo pomocny w tej pracy.

Don Kichot
źródło
3

W przypadku określonego folderu użyłem:

git checkout -- FolderToClean/*
Glauco Neves
źródło
3
To nie usuwa nieśledzonych plików, jak stwierdza OP.
vonbrand,
0

Jest to prawdopodobnie odpowiedź noob, ale: Używam TortoiseGit dla systemu Windows i ma przyjemną funkcję o nazwie REVERT. Tak więc, aby cofnąć lokalne niestacjonarne nieprzesłane zmiany, należy:

  1. wywołać menu kontekstowe dla potrzebnego folderu i wybrać Cofnij, pokazuje wyskakujące okienko, w którym możesz wybrać zmienione pliki do przywrócenia / odzyskania.
  2. Jeśli chcesz również usunąć dodane pliki (które nie są jeszcze w git), kliknij przycisk zatwierdzenia (z tego samego menu kontekstowego), wyświetli się wyskakujące okno Zatwierdź i wyświetli dodane pliki, a następnie kliknij prawym przyciskiem myszy każdy z nich i wybierz opcję Usuń. Ale nie naciskaj przycisku Commit btn w tym wyskakującym okienku, ponieważ nie chcesz zatwierdzać, ale widzisz tylko dodane pliki i usuwasz je stąd.
Oleg Woroncowa
źródło