git reset - twardy HEAD pozostawia nie śledzone pliki

584

Kiedy biegnę git reset --hard HEAD, powinien zresetować się do nieskazitelnej wersji tego, co wyciągnąłeś, jak rozumiem. Niestety, pozostawia pliki leżące, ponieważ git statuspokazuje dużą listę nieśledzonych plików.

Jak powiedzieć gitowi „Po prostu przywróć to DOKŁADNIE, co było w ostatnim pociągnięciu, nic więcej, nic mniej”?

Karl
źródło
44
git reset --hardresetuje indeks i przywraca śledzone pliki do stanu, w jakim znajdują się w HEAD. Pozostawia nieśledzone pliki w spokoju.
fifigyuri,

Odpowiedzi:

903

Musisz użyć, git clean -f -daby pozbyć się nieśledzonych plików i katalogów w kopii roboczej.

Jeśli musisz zresetować całe repozytorium do master, w tym wszystkie podmoduły git, uruchom ten skrypt:

git reset --hard HEAD
git clean -f -d
git checkout master
git fetch origin master
git reset --hard origin/master
git pull
git submodule update
git submodule update --init --recursive
git submodule foreach git reset --hard HEAD
git submodule foreach git clean -f -d
git submodule foreach git submodule update --init --recursive
git submodule foreach git fetch
git submodule foreach git pull
git status
knittl
źródło
56
Również -xjeśli chcesz usunąć pliki .gitignored i wrócić do nieskazitelnego stanu.
jtdubs
44
Dodaj -ndo testu zostanie najpierw usunięty. połącz je wszystkie w jeden argument:-dfn
HyBRiD,
31
Moje wspólne polecenie jest git clean -qfdxtutaj. Usuń wszystko i zrób to po cichu.
aragaer
3
-d -fmożna decalred dwa razy -dffza -d -f -fto będzie usunąć wszystkie nieśledzone katalogów, w tym chronionych nieśledzonej katalogów.
ThorSummoner,
3
@BKSpurgeon: tak, usuwa pliki. Co masz na myśli mówiąc „Chcę, aby pliki nie były śledzone tak jak wcześniej”? Git nie wie nic o nieśledzonych plikach, poza tym, że istnieją. Nie śledzi wielu wersji tych plików (ponieważ nie są one śledzone ).
knittl,
60

Jeśli masz pliki, które nadal chcesz zachować:

git clean -di wykona interaktywne czyszczenie, które pozwoli ci usunąć tylko te pliki / katalogi, których już nie chcesz.

Sogger
źródło
48
git reset --hard && git clean -dfx

lub zsh zapewnia alias „gpristine”:

alias gpristine='git reset --hard && git clean -dfx'

Co jest naprawdę przydatne.

Jeśli pracujesz nad rozwidlonym repozytorium, pamiętaj, aby pobrać i zresetować z prawidłowego repozytorium / gałęzi, na przykład:

git fetch upstream && git reset --hard upstream/master && git clean -df
jjnevis
źródło
8
Przepraszam, jeśli to nie jest bezpieczne polecenie - nie próbowałem być bezpieczny, próbowałem odpowiedzieć na pytanie. Czy mógłbyś skomentować, czy to odpowiada na pytanie?
jjnevis
3
Działa to dobrze i powinno być wbudowane w git IMHO (chociaż nie jestem pewien, czy używałbym -x rutynowo). Tak wiele razy pracuję nad lokalnym projektem, który nie jest jeszcze zsynchronizowany z githubem itp., A bałaganiarski refaktor szaleje poza stanem „cofnięcia” IDE. Mój instynkt polega na tym, aby wrócić do ostatniego zatwierdzenia, ale szukanie go w Google zwykle wymaga odpowiedzi na przedostatnie zatwierdzenie, a nie ostatnie zatwierdzenie. Chcę tylko wrócić do ostatniego zatwierdzenia. To robi to. Powinno to być łatwiejszy sposób. Dzięki, Linusie! ;-)
Dell Anderson
5
Jest to niebezpieczne, ponieważ usuwa również zignorowane pliki w -xpodobny sposób, gdybyś właśnie sklonował repo. Jeśli tego właśnie chcesz, jest idealny. Jeśli chcesz tylko usunąć nieśledzone pliki, usunięcie tej -xopcji działa dobrze.
Emile Bergeron,
2
Dzięki Bogu zagpristine
Snowcrash
2
i usuwa ustawienia intellijskie;)
Kalpesh Soni
17

Interaktywne podejście użytkownika:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i dla interaktywnego
-f dla wymuszenia
-d dla katalogu
-x dla ignorowanych plików (dodaj, jeśli wymagane)

Uwaga: Dodaj -n lub --dry-run, aby sprawdzić, co zrobi.

bit_cracker007
źródło
4

Możesz użyć git stash. Musisz określić --include-untracked, w przeciwnym razie skończy się oryginalny problem.

git stash --include-untracked

Następnie po prostu upuść ostatni wpis w skrytce

git stash drop

Możesz dla tego zrobić przydatny alias dandysa i nazwać go git wipena przykład:

git config --global alias.wipe "! git stash -q --include-untracked && git stash drop -q"
Nikola Diklic
źródło
2

Polecenie, którego szukasz, to git clean

Jagriti Kumari
źródło
4
Następnym razem dodaj trochę więcej opisów / przykładów itp. Cokolwiek pomaga użytkownikowi zrozumieć, co robi i, w tym przypadku, jakich parametrów użyć.
rugk
1

git-clean Służy do usuwania nieśledzonych plików z drzewa roboczego. Poniżej przedstawiono niektóre opcje (w skrócie), których można używać z git cleanpoleceniem.

-dużyj, gdy nie określono ścieżki. Więc gur recurse w niewykrytych katalogach usuń je.

-f/--force Aby usunąć zagnieżdżone pliki bez śledzenia.

-i/--interactive Pokaż, co można zrobić, i czyść pliki interaktywnie.

-n/--dry-run Pokaż, co się stanie bez usuwania czegokolwiek.

-x ignoruj ​​pliki

przykład: git clean -f -d-> Usuń wszystkie nieśledzone pliki z bieżącego katalogu z wszystkich podkatalogów.

Yuresh Karunanayake
źródło
-16

Być może w pewnym momencie wykonałeś miękki reset, możesz rozwiązać ten problem, wykonując tę ​​czynność

git add .
git reset --hard HEAD~100
git pull
użytkownik3780587
źródło
7
Nie sądzę, żeby tego właśnie chciał OP. Każda z pozostałych odpowiedzi znacznie lepiej pokazuje, jak to naprawić.
Avery
1
Może to być również powolne, jeśli masz dużo plików do dodania.
Devin G Rhode,
4
całkowicie niezwiązany.
Azeem Hassni
1
W ten sposób nieśledzone pliki są usuwane. Ale jako programiści każdy powinien spróbować znaleźć właściwe rozwiązanie problemów bez korzystania z obejść i uśmiechu.
Yuresh Karunanayake,