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.