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ć?


1
@Joel & Wayfarer: dlaczego nie spróbować git help resetigit help clean
SHernandez

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


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


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 .


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.


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


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

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.


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.


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.


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


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.


3

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

git checkout -- FolderToClean/*

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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.