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.
@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ę:
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.
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 .
@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.
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.
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
+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.
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.
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ć.
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:
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.
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.
git help reset
igit help clean
Odpowiedzi:
Aby zobaczyć, co zostanie wcześniej usunięte, bez faktycznego usuwania, użyj
-n
flagi (jest to w zasadzie test). Gdy będziesz gotowy do faktycznego usunięcia, usuń-n
flagę:git clean -nfd
źródło
git clean -fxd
moż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ść.git clean -f -d
usunie 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ć.Najbezpieczniejsza metoda, z której często korzystam:
Wyjaśnienie składni jak na
/docs/git-clean
stronie:-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 -nd
który wykonuje próbę na sucho i mówi, co należy usunąć przed faktycznym usunięciem.Link do
git clean
strony z dokumentami: https://git-scm.com/docs/git-cleanźródło
git clean -nd .
przed faktycznym usunięciem plików korzystałem zgit clean -fd .
add -A
+commit -a
+revert head
wcześniejgit 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?Do wszystkich plików niestacjonarnych użyj:
.
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 .źródło
src/app/work/filename.js
i../app/working/test/filename.js
. Samo użyciegit 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.Spójrz na
git clean
polecenie.źródło
git clean -i
i wybrałem „czyste” z menu - to w końcu usunęło nowe pliki.Następujące prace:
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
źródło
git stash drop
?git add -A .
). Straciłem 30 m, ponieważ nie było dopasowania pliku. Dzięki!Możesz to zrobić w dwóch krokach:
git checkout -f
git clean -fd
źródło
Myślałem, że tak ( ostrzeżenie: usunięcie spowoduje wszystko )
The
reset
Aby cofnąć zmiany.clean
Celu usunięcia untracked f iles i d irectories.źródło
git pull
później:CONFLICT (content): Merge conflict in...
Rozwiązałem to tylko przezgit pull --strategy=ours
Spowoduje to usunięcie wszystkich nieśledzonych plików.
źródło
git clean -i
pokaż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 clean
więcej informacji, w tym kilka innych przydatnych opcji.źródło
Jeśli chcesz odrzucić wszystkie zmiany, możesz użyć dowolnej poprawnej opcji z aliasu w
.gitconfig
. Na przykład:Stosowanie:
git discard
źródło
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:
Lub możesz to zrobić na odłączonym HEAD. (zakładając, że zaczynasz w gałęzi 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.
Jest to bardziej szczegółowe, ale pozwala dokładnie sprawdzić, które zmiany chcesz odrzucić.
Te
git lol
igit lola
skróty zostały bardzo pomocny w tej pracy.źródło
W przypadku określonego folderu użyłem:
źródło
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:
źródło