Jak usunąć pojedynczy plik z obszaru pomostowego (cofnąć polecenie git add)?


1229

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?


40
Strefą inscenizacji jest indeks, więc może mógłbyś dokładnie wyjaśnić, co masz na myśli?
CB Bailey,


Odpowiedzi:


1901

Jeśli dobrze rozumiem pytanie, po prostu chcesz „cofnąć” to, git addco 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 statusplik ponownie pojawi się jako zmodyfikowany, ale jeszcze nie etapowy.

Szczegółowe informacje można znaleźć na git resetstronie podręcznika man .


41
Dzięki ... Właśnie zauważyłem, że jest to napisane tuż nad plikami etapowymi. Chyba tak długo patrzyłem na ten ekran, że wybrałem to, co chciałem zobaczyć.
PHLAK

2
To powoduje scenę wszystkich moich zmian, w przeciwieństwie do każdej porady, którą otrzymałem nigdzie (strony podręcznika, tutaj, przyjaciele i c). Ciągle myślę, że kiedyś zrobi to, co się reklamuje, ale nie.
rektide

6
Czy w ogóle istnieje możliwość usunięcia plików ze środowiska pomostowego, gdy nie było żadnych zmian w repozytorium?
Jared Forsyth

3
Wciąż przychodzę i przychodzę do tego pytania. Dlaczego nie mogę głosować więcej razy? :)
Puce

3
@Jared Forsyth Aby usunąć plik, który nigdy nie został zatwierdzony na scenie, użyj polecenia git rm --cached FILEsugerowanego przez inną odpowiedź.
chmike

150
git rm --cached FILE

,

git rm -r --cached CVS */CVS

28
to prawda, ale git resetmyślę, że lepiej tutaj użyć , ponieważ możesz pominąć opcję --chached i szybko zasmucić się za pomocą git rmpolecenia :-) Jeśli git resetjesteś po bezpiecznej stronie, jeśli zapomnisz dodać „jakąś opcję”, zachowaj zmianę, aby była „bezpieczniejsza” do codziennego użytku (mówię o git reset --hard).
Konrad „ktoso” Malawski

20
Ta metoda jest przydatna, jeśli nie masz wcześniejszych zatwierdzeń.
SomeKittens

2
git rm --cached FILEetapy usuwania pliku, bez usuwania pliku z drzewa roboczego. To jest inne niż pytanie, które dotyczyło cofnięcia git add.
Sampo Smolander,

1
Ta odpowiedź powoduje błąd, jeśli plik został usunięty z działającego drzewa.
Samuel Robert,

3
git rm --cachedspowoduje 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/…
smwikipedia

88

git reset <file>

Działa niezależnie od tego, czy masz wcześniejsze zobowiązania.


53

Tak więc, drobna korekta odpowiedzi Tima Henigana: musisz użyć - przed nazwą pliku. Wyglądałoby to tak:

git reset HEAD -- <file>

6
Co robi --i dlaczego to dodaje? Zrobiłem git reset HEAD <file>i zadziałało.
Paolo,

15
--jest rodzajem dzielnika. W przypadku, gdy nazwa pliku jest niekonwencjonalna, np. ( -fLub master) git zinterpretuje go jako argument wiersza poleceń lub nazwę gałęzi zamiast nazwy pliku. Zobacz tutaj
Andrew

3
Działa to dla mnie tam, gdzie polecenie bez - nie ze względu na brak wcześniejszych zatwierdzeń dla tego pliku. Dzięki.
Matt

17
git reset filename.txt

Jeś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.


6

Jeśli chcesz tylko usunąć podzbiór zmian w swoim pliku, możesz użyć:

git reset -p

lub

git reset -p <file_name>

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ę.


4

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 .


2

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

git reset HEAD file_name.ext

lub

git reset HEAD path/to/file/file_name.ext

2

Gdy to zrobisz git status, Git powie Ci, jak się wycofać:

Changes to be committed: (use "git reset HEAD <file>..." to unstage).

Tak git reset HEAD <file>działało dla mnie i zmiany nie zostały zmienione.


2

Myślę, że prawdopodobnie pomyliłeś się z pojęciem indeksu , jak skomentował @CB Bailey:

Obszar przejściowy to indeks.

Możesz po prostu uznać katalog pomostowy i indeks za to samo.
Tak więc, podobnie jak odpowiedź @Tima Henigana , myślę:

po prostu chcesz „cofnąć” to, git addco zostało zrobione dla tego pliku.



Oto moja odpowiedź:

Zwykle istnieją dwa sposoby cofnięcia operacji etapowej , jak już wspomniano w innych odpowiedziach:

git reset HEAD <file>

i

git rm --cached <file>

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 jako deletedw katalogu pomostowym , jeśli używasz

git status

po tej operacji zobaczysz:

        deleted:    <file>

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 .


2

Po wersji 2.23Git wprowadził git restorepolecenie, którego można użyć do tego celu. Cytując oficjalną dokumentację:

Przywróć określone ścieżki w działającym drzewie z częścią zawartości ze źródła przywracania. Jeśli ścieżka jest śledzona, ale nie istnieje w źródle przywracania, zostanie usunięta w celu dopasowania do źródła.

Polecenia można także użyć do przywrócenia zawartości indeksu za pomocą --stagedlub przywrócenia zarówno drzewa roboczego, jak i indeksu za pomocą --staged --worktree.

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.


1

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

Ctrl+U (dla Windowsa)

aby je wystawić.


1

Dostępne są nowsze wersje Gita git restore --staged <file>.

Kiedy robię git statusz wersją Git, 2.26.2.windows.1jest to również zalecane do rozpakowywania:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

( Ten post pokazuje, że we wcześniejszych wersjach git reset HEADbył zalecany w tym momencie)

Bardzo polecam ten wpis wyjaśniający różnice między git revert, git restorea git reset, a także dodatkowe parametry git restore.


0

Moja próbka:

$ git status
On branch feature/wildfire/VNL-425-update-wrong-translation
Your branch and 'origin/feature/wildfire/VNL-425-update-wrong-translation' have diverged,
and have 4 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   ShopBack/Source/Date+Extension.swift
    modified:   ShopBack/Source/InboxData.swift
    modified:   ShopBack/en.lproj/Localizable.strings

Jak możesz zauważyć

> Changes to be committed:
>       (use "git reset HEAD <file>..." to unstage)

-1

Musisz znajdować się w katalogu pliku, a następnie wpisać następujące polecenie w terminalu

git reset HEAD .

Zakładamy, że musisz zresetować tylko jeden plik.



-10

git checkout -- <file>

Działa idealnie, aby usunąć pliki z obszaru przejściowego


4
jak zauważono poniżej, przywraca to zmiany w pliku, co idzie o krok dalej niż OP chce.
stolli

git rm flie.txt --cached
Juan Ramirez

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.