Sytuacja: Mam repozytorium Git z plikami już w indeksie. Wprowadzam zmiany w kilku plikach, otwieram Git i dodam te pliki do mojego obszaru testowego za pomocą „git add”.
Pytanie: Jak usunąć jeden z tych plików z obszaru przejściowego, ale nie usunąć go z indeksu ani cofnąć zmian w samym pliku?
git
version-control
staging
PHLAK
źródło
źródło
Odpowiedzi:
Jeśli dobrze rozumiem pytanie, po prostu chcesz „cofnąć” to,
git add
co zostało zrobione dla tego pliku.Jeśli chcesz usunąć pojedynczy plik z obszaru przejściowego, użyj
git reset HEAD -- <file>
Jeśli chcesz usunąć cały katalog (folder) z obszaru przejściowego, użyj
git reset HEAD -- <directoryName>
Twoje modyfikacje zostaną zachowane. Po uruchomieniu
git status
plik ponownie pojawi się jako zmodyfikowany, ale jeszcze nie etapowy.Szczegółowe informacje można znaleźć na
git reset
stronie podręcznika man .źródło
git rm --cached FILE
sugerowanego przez inną odpowiedź.,
źródło
git reset
myślę, że lepiej tutaj użyć , ponieważ możesz pominąć opcję --chached i szybko zasmucić się za pomocągit rm
polecenia :-) Jeśligit reset
jesteś po bezpiecznej stronie, jeśli zapomnisz dodać „jakąś opcję”, zachowaj zmianę, aby była „bezpieczniejsza” do codziennego użytku (mówię ogit reset --hard
).git rm --cached FILE
etapy usuwania pliku, bez usuwania pliku z drzewa roboczego. To jest inne niż pytanie, które dotyczyło cofnięciagit add
.git rm --cached
spowoduje usunięcie pliku z indeksu, tzn. plik stanie się plikiem nieśledzonym . Nie sądzę, że tego właśnie chce OP. Zobacz powiązany wątek tutaj: stackoverflow.com/questions/45047810/…git reset <file>
Działa niezależnie od tego, czy masz wcześniejsze zobowiązania.
źródło
Tak więc, drobna korekta odpowiedzi Tima Henigana: musisz użyć - przed nazwą pliku. Wyglądałoby to tak:
źródło
--
i dlaczego to dodaje? Zrobiłemgit reset HEAD <file>
i zadziałało.--
jest rodzajem dzielnika. W przypadku, gdy nazwa pliku jest niekonwencjonalna, np. (-f
Lubmaster
) git zinterpretuje go jako argument wiersza poleceń lub nazwę gałęzi zamiast nazwy pliku. Zobacz tutajJeśli masz modyfikację w pliku nazwa_pliku.txt, przez pomyłkę dodałeś ją do sceny i chcesz usunąć plik ze środowiska tymczasowego, ale nie chcesz utracić zmian.
źródło
Jeśli chcesz tylko usunąć podzbiór zmian w swoim pliku, możesz użyć:
lub
To polecenie jest w zasadzie odwrotnością
git add -p
: usuwa tylko wybrane zmiany z obszaru przemieszczania. Uważam, że jest to bardzo przydatne w „dodawaniu” czegoś, co dodałem przez pomyłkę.źródło
Jeśli chcesz usunąć pliki według określonego wzorca i używasz
git rm --cached
, możesz również użyć wzorców globu plików.Zobacz tutaj .
źródło
Chcesz:
Wpływa na pojedynczy plik
Usuń plik z obszaru przejściowego
Nie usuwaj pojedynczego pliku z indeksu
Nie cofaj samej zmiany
i rozwiązaniem jest
lub
źródło
Gdy to zrobisz
git status
, Git powie Ci, jak się wycofać:Tak
git reset HEAD <file>
działało dla mnie i zmiany nie zostały zmienione.źródło
Myślę, że prawdopodobnie pomyliłeś się z pojęciem indeksu , jak skomentował @CB Bailey:
Możesz po prostu uznać katalog pomostowy i indeks za to samo.
Tak więc, podobnie jak odpowiedź @Tima Henigana , myślę:
Oto moja odpowiedź:
Zwykle istnieją dwa sposoby cofnięcia operacji etapowej , jak już wspomniano w innych odpowiedziach:
i
Ale jaka jest różnica?
Załóżmy, że plik został wystawił i istnieje w katalogu pracuje też wykorzystanie
git rm --cached <file>
jeśli chcesz go usunąć z inscenizacji katalog i zachować plik w katalogu roboczego . Ale zauważ, że ta operacja nie tylko usunie plik z katalogu pomostowego, ale także oznaczy plik jakodeleted
w katalogu pomostowym , jeśli używaszpo tej operacji zobaczysz:
Jest to zapis usuwania pliku z katalogu pomostowego . Jeśli nie chcesz zachować tego rekordu i po prostu chcesz cofnąć operację na poprzednim etapie pliku, użyj
git reset HEAD <file>
zamiast tego.-------- KONIEC ODPOWIEDZI --------
PS: Zauważyłem niektóre wspomniane odpowiedzi:
git checkout -- <file>
To polecenie dotyczy sytuacji, gdy plik został przemieszczony , ale plik został zmodyfikowany w katalogu roboczym po przemieszczeniu . Użyj tej operacji, aby przywrócić plik w katalogu roboczym z katalogu przemieszczania . Innymi słowy, po tej operacji zmiany następują w katalogu roboczym , a NIE w katalogu pomostowym .
źródło
Po wersji
2.23
Git wprowadziłgit restore
polecenie, którego można użyć do tego celu. Cytując oficjalną dokumentację:Możesz więc wywoływać
git restore --staged <path>
i wycofywać pliki, ale także zachować wprowadzone zmiany. Pamiętaj, że jeśli plik nie był przemieszczany, tracisz wszystkie wprowadzone w nim zmiany.źródło
Jeśli wprowadzisz zmiany w wielu śledzonych plikach, ale chcesz wprowadzić tylko kilka z nich, wykonaj polecenie
git add .
nie zawsze jest korzystne (lub zalecane) - ponieważ programuje wszystkie śledzone pliki (niektóre przypadki, w których chcesz zachować zmiany tylko dla siebie i nie chcesz wprowadzać ich do zdalnego repozytorium).
nie jest też idealne robienie kilku
git add path/to/file1 path/to/file2
jeśli masz dużo zagnieżdżonych katalogów (co ma miejsce w większości projektów) - robi się denerwujące
Wtedy Git GUI jest pomocny (prawdopodobnie tylko raz go używam). Wystarczy otworzyć Git GUI, pokazuje sekcje plików etapowych i niestacjonarnych. Wybierz pliki z sekcji etapowej, którą chcesz rozpakować i naciśnij
aby je wystawić.
źródło
Dostępne są nowsze wersje Gita
git restore --staged <file>
.Kiedy robię
git status
z wersją Git,2.26.2.windows.1
jest to również zalecane do rozpakowywania:( Ten post pokazuje, że we wcześniejszych wersjach
git reset HEAD
był zalecany w tym momencie)Bardzo polecam ten wpis wyjaśniający różnice między
git revert
,git restore
agit reset
, a także dodatkowe parametrygit restore
.źródło
Moja próbka:
Jak możesz zauważyć
źródło
Musisz znajdować się w katalogu pliku, a następnie wpisać następujące polecenie w terminalu
Zakładamy, że musisz zresetować tylko jeden plik.
źródło
Aby cofnąć wszystko od razu, uruchom to polecenie
źródło
git checkout -- <file>
Działa idealnie, aby usunąć pliki z obszaru przejściowego
źródło
W moim przypadku tak
źródło