Jak usunąć pliki z obszaru testowego git?

548

Wprowadziłem zmiany w niektórych moich plikach w moim lokalnym repozytorium, a następnie zrobiłem to, git add -Aco, jak sądzę, dodało zbyt wiele plików do obszaru przejściowego. Jak mogę usunąć wszystkie pliki z obszaru przejściowego?

Gdy to zrobię, zrobię to ręcznie git add "filename".

omega
źródło
2
Mam nadzieję, że tego szukasz: stackoverflow.com/questions/1505948/...
sumitb.mdi
27
git statusjuż mówi dokładnie, co należy zrobić, jeśli chcesz wyrzucić scenę z plików.
Michael Foukarakis
6
@MichaelFoukarakis status git nie jest tak pomocny, jeśli chcesz rozpakować cały katalog, jeśli zalewają terminal wyjściem (np. Moduły_węzła)
whiterook6
2
W przyszłości zamiast dodawać wszystko, możesz poczuć się komfortowo z git add -plub git add --patch(są takie same). Ta flaga pozwala interaktywnie wybierać pliki lub poszczególne zmiany, które chcesz wprowadzić na scenę - dzięki temu możesz uzyskać bardziej szczegółowe informacje na temat tego, co robisz w zatwierdzeniu.
Gabe

Odpowiedzi:

689

Możesz wycofać pliki z indeksu za pomocą

git reset HEAD -- path/to/file

Podobnie git add, możesz wycofać pliki rekursywnie według katalogu itd. Aby wszystko odłączyć od razu, uruchom to z katalogu głównego repozytorium:

git reset HEAD -- .

Ponadto, w przyszłości, dane wyjściowe git statuspodadzą polecenia, które należy uruchomić, aby przenieść pliki z jednego stanu do drugiego.

Ash Wilson
źródło
5
$ git reset HEAD -- .wyprodukowano fatal: Failed to resolve 'HEAD' as a valid ref.Zauważ, że nigdy nie dokonałem żadnego zatwierdzenia; jego pierwszy git addpogit init
Patrizio Bertoni
5
Możesz także użyć git reset @.
alex
@alex Czy to jest lepsze niż zwykły git reset?
Antony Hatchkins,
7
@AntonyHatchkins @jest synonimem HEAD.
alex
Totally dla mnie pracował, dzięki!
wayneseymour
303

Posługiwać się

git reset

aby cofnąć scenę z wszystkich przemieszczanych plików.

Antony Hatchkins
źródło
3
Czy mogę zapytać, jak to się różni, git reset HEAD --czy jest to po prostu bardziej zwięzły sposób wykonywania tej samej operacji?
ProNotion
1
@ProNotion Reset używa HEADdomyślnie. Jaki jest cel tych --w twoim git reset HEAD --?
Antony Hatchkins
@AntonyHatchkins powinien nastąpić kropka (kropka) i wzięty z przykładu w zaakceptowanej odpowiedzi.
ProNotion
11
@ProNotion Przepraszamy, źle cię zrozumiałem. git reset HEAD -- .różni się tym, że resetuje tylko pliki w bieżącym katalogu i poniżej, a git resetresetuje wszystkie pliki w projekcie.
Antony Hatchkins
100

Jeśli już popełniłeś kilka niechcianych plików, możesz je wycofać i powiedzieć gitowi, aby oznaczył je jako usunięte (bez faktycznego ich usuwania) za pomocą

git rm --cached -r .

--cachednakazuje mu usunięcie ścieżek ze środowiska pomostowego i indeksu bez usuwania samych plików i -rrekursywnie działa na katalogach. Możesz następnie git adddowolne pliki, które chcesz śledzić.

Max
źródło
Przypuszczam, że to „git rm -”.
Alexander Mills,
1
wystąpił błąd krytyczny związany z nieusuwaniem plików za pomocą „git rm -.”
Alexander Mills,
@AlexMills Aktualizuję swoją odpowiedź, aby wspomnieć o rzeczywistych opcjach rmwycofania wszystkich plików.
Maks.
2
Próbowałem tego na pojedynczym pliku, takim jak ten: „git rm --cached my / file.java” i widzę ten plik nadal w obszarze testowym, ale jest usunięty! @Max po uruchomieniu tego polecenia, czy twoje pliki są faktycznie usuwane lub po prostu nie są przenoszone? Jeśli nie szukasz takiego zachowania, wybrałbym odpowiedź.
OrwellHindenberg,
@OrwellHindenberg dzięki za zwrócenie na to uwagi! --cachednaprawdę przestaje śledzić pliki, które już zatwierdziłeś. Tak więc plik nie jest faktycznie usuwany, ale git uważa, że ​​tak. Wyjaśniłem to w mojej odpowiedzi.
Max
30

Możesz użyć

git reset HEAD

następnie dodaj określone pliki, które chcesz

git add [directory/]filename
Aloza
źródło
Możesz dodać parametr -x, a ignorowane pliki również zostaną usunięte. Jest to przydatne, jeśli zepsujesz swój .gitignore i masz tam coś przydatnego (jak w moim przypadku). ( git-scm.com/docs/git-clean )
Keeprock
1
Nadmiar folderów git statuspowie ci, że katalog roboczy jest czysty - kłamstwa! git clean -dfwykonał swoją pracę, dzięki.
Leo
5
Pamiętaj, że git clean -dfspowoduje trwałe usunięcie plików. W systemach typu UNIX zadzwoni, unlink()a usuniętych plików nie będzie można odzyskać.
Hanxue
11
OP pyta o wycofanie plików. Radzisz mu usunąć pliki. Sugeruję, abyś przeczytał o tym, czym jest obszar przeciwny przed odpowiedzią.
Antony Hatchkins,
Dziękuję za usunięcie całego mojego niezapisanego projektu.
Vansuita Jr.
7

Jak zaznaczono w innych odpowiedziach, powinieneś użyć git reset. Spowoduje to cofnięcie działania git add -A.

Uwaga: git reset odpowiada git reset --mixedtemu

Resetuje indeks, ale nie działające drzewo (tzn. Zmienione pliki są zachowane, ale nie są oznaczone do zatwierdzenia) i zgłasza, co nie zostało zaktualizowane. To jest akcja domyślna. [ git reset ]

Dan Rosenstark
źródło
2
.. i aby usunąć pojedynczy plik z obszaru przejściowego, możesz to zrobićgit reset filenameToNotCommit
SherylHohman
5

Teraz sugeruje v2.24.0

git restore --staged .

do wycofywania plików.

norixxx
źródło
1

Możesz zresetować obszar przemieszczania na kilka sposobów:

  1. Zresetuj HEAD i dodaj wszystkie niezbędne pliki do odprawy ponownie, jak poniżej:

     git reset HEAD ---> removes all files from the staging area
     git add <files, that are required to be committed>
     git commit -m "<commit message>"
     git push 
    
Amit Kaneria
źródło
Co odróżnia tę odpowiedź od istniejących sześciu odpowiedzi?
Antony Hatchkins,
1

Aby usunąć wszystkie pliki z obszaru przejściowego użyj -
git reset
Aby usunąć określone użycie pliku -
git reset "File path"

Akash Bisariya
źródło
1

posługiwać się

git reset HEAD

Spowoduje to usunięcie wszystkich plików z obszaru przejściowego

Ajith
źródło
1

Jeśli niechciane pliki zostały dodane do obszaru przejściowego, ale nie zostały jeszcze zatwierdzone, wystarczy proste resetowanie:

$ git reset HEAD file
# Or everything
$ git reset HEAD .

Aby usunąć tylko niestabilne zmiany w bieżącym katalogu roboczym, użyj:

git checkout -- .
Vlad Bezden
źródło
0

Użyj „ git reset HEAD <file>...”, aby wycofać pliki

np .: aby wycofać scenę z wszystkich plików

git reset HEAD .

wycofać scenę z jednego pliku

git reset HEAD nameFile.txt
Amirouche Zeggagh
źródło
-3

Wypróbowałem wszystkie te metody, ale żadna nie działała dla mnie. Usunąłem .git plik, używając rm -rf .gitformularz lokalne repozytorium, a następnie ponownie zrobił git initi git addi rutynowe polecenia. Zadziałało.

Bhaskar Dhariyal
źródło
4
Czytanie dokumentów git jest na ogół bardziej satysfakcjonujące niż stosowanie się do rad xkcd.com/1597 ;)
Antony Hatchkins
1
Być może miałeś problem z integralnością w konkretnym przypadku i ta opcja pozostała, ale nie jest to zalecane.
Shad
Nie rób tego, zniszczysz całe repozytorium git.
Lennart Rolland
-5

Najlepszym sposobem na cofnięcie pliku, który jest już w obszarze testowym, jest git reset - twardy, który przywraca pliki z powrotem. Ostrożnie, to spowoduje usunięcie zmian etapowych i nieetapowych.

dane w pikselach
źródło
2
To jest złe i niebezpieczne !!! OP chce później „tylko ręcznie dodać” pliki, ale --hardusuwa je na zawsze.
Antony Hatchkins,