Jak usunąć plik z indeksu w git?

355

Jak usunąć plik z indeksu (= obszar pomostowy = pamięć podręczna) bez usuwania go z systemu plików?

hcs42
źródło
5
Masz na myśli „zresetuj to, co było tam wcześniej” lub „usuń, ponieważ nie chcę już tego pliku”?
Andrew Aylett,
W moim przypadku jest tak samo, ponieważ plik nie istniał wcześniej ...
hcs42

Odpowiedzi:

504

Chcesz:

git rm --cached [file]

Pominięcie tej --cachedopcji spowoduje również usunięcie jej z działającego drzewa. git rmjest nieco bezpieczniejszy niż git reset, ponieważ zostaniesz ostrzeżony, jeśli zawartość przemieszczana nie pasuje do końcówki gałęzi lub pliku na dysku. (Jeśli nie, musisz dodać --force.)

John Feminella
źródło
8
Działa to również świetnie, jeśli np. Przypadkowo zaznaczyłeś jakieś pośrednie kompilacje lub lokalne pliki konfiguracyjne, które nie dostały się do twojego .gitignore; użyj, git rm --cachedaby usunąć je z repozytorium, dodać odpowiednie pliki lub katalogi do .gitignore, wyrenderować i zatwierdzić jak zwykle. Zostaną usunięte z repozytorium, ale pozostaną nietknięte w twoim lokalnym drzewie i nie będziesz ich przypadkowo sprawdzał.
Ionoclast Brigham,
22
Spowoduje to również usunięcie pliku z repo (zdalnego) po zatwierdzeniu i wypchnięciu.
proszek 366
6
To nie usuwa go z indeksu, ale oznacza jako usunięte z indeksu.
JotaBe
4
Ta odpowiedź jest prawdopodobnie błędna, ponieważ usuwa plik z repozytorium (jak już wspomniano @ powder366), co nie jest zamierzonym rezultatem.
otomo
1
To rozwiązanie nie działało dla mnie. Oznaczono określony plik jako usunięty, a następnie usuwa go z lokalnego repozytorium.
paiego
134

Powinno to rozpakować <plik> dla Ciebie (bez usuwania lub modyfikowania pliku w inny sposób):

git reset <file>
David Underhill
źródło
6
To usuwa ostatnią zmianę dla określonego pliku, ale zachowuje ją w repozytorium (zdalnie) po zatwierdzeniu i wypchnięciu.
proszek 366
1
Oto odpowiedź, której szukałem. Pamiętaj, że nie musisz określać HEAD.
Michael Dorst,
Dobry punkt @MichaelDorst. Zaktualizowałem odpowiedź, aby pominąć HEAD!
David Underhill
3
git reset HEAD <file> 

do usuwania określonego pliku z indeksu.

i

git reset HEAD

do usuwania wszystkich indeksowanych plików.

Abdul Gafoor
źródło
1

W zależności od przepływu pracy może to być coś, czego tak rzadko potrzebujesz, że nie ma sensu próbować znaleźć rozwiązania wiersza polecenia (chyba że z jakiegoś powodu pracujesz bez interfejsu graficznego).

Wystarczy użyć jednego z narzędzi opartych na graficznym interfejsie użytkownika, które obsługują zarządzanie indeksami, na przykład:

  • git gui <- używa frameworka okien Tk - podobny styl gitk
  • git cola <- bardziej nowoczesny interfejs GUI

Umożliwiają one przenoszenie plików do indeksu i opuszczanie go przez wskazywanie i klikanie. Obsługują nawet wybieranie i przenoszenie części pliku (pojedyncze zmiany) do iz indeksu.


Co powiesz na inną perspektywę: Jeśli popsuniesz się podczas korzystania z jednego z sugerowanych, raczej tajemniczych poleceń:

  • git rm --cached [file]
  • git reset HEAD <file>

... masz prawdziwą szansę na utratę danych - a przynajmniej utrudnienie znalezienia. Chyba że naprawdę musisz to robić z bardzo wysoką częstotliwością, korzystanie z narzędzia GUI może być bezpieczniejsze .


Praca bez indeksu

Na podstawie komentarzy i głosów zdałem sobie sprawę, że wiele osób cały czas korzysta z indeksu. Ja nie. Oto jak:

  • Zatwierdź cały mój egzemplarz roboczy (typowy przypadek): git commit -a
  • Zatwierdź tylko kilka plików: git commit (list of files)
  • Zatwierdź wszystkie zmodyfikowane pliki oprócz kilku: git commit -anastępnie wprowadź zmiany za pomocągit gui
  • Przejrzyj graficznie wszystkie zmiany w kopii roboczej: git difftool --dir-diff --tool=meld
nobar
źródło
@Martin: Myślę, że to zależy od twojego przepływu pracy. W moim podejściu nigdy nie używam indeksu bezpośrednio. Kiedy chcę zapisać swoją pracę, po prostu robię pełne zobowiązania git commit -a. Kiedy odpowiadałem na to pytanie, dzieje się tak dlatego, że zrobiłem (egzotyczny) „ odwrotny cherry pick ”, który umieszcza pliki w indeksie dla ciebie, ale chciałem edytować plik przed jego zatwierdzeniem. Wyjąłem plik z indeksu podczas edycji, aby różnice działały tak, jak kiedyś.
nobar
mój przypadek użycia był bardzo wąski i bezużyteczny: utwórz gałąź; dodaj folder wypełniony plikami tylko dla oddziału; przełączyć na master; łączyć; ops, dodano niewłaściwy folder do opanowania, dodaj go do gitignore; pliki nie byłyby usuwane z zatwierdzenia - oczywiście, lepszym rozwiązaniem byłoby użycie rmod razu, ale najpierw pomyślałem, że zmiana gałęzi nie zabije zignorowanego folderu. ale ... używam narzędzia „opartego na gui” github, które jest dla mnie wystarczająco dobre i obsługuję zarządzanie indeksem, ale nie obsługuje tego. więc co, powinienem używać 2 GUI do wąskiego użytku? wciąż nie mogę się zgodzić z odpowiedzią.
cregox
3
To zdecydowanie niepopularna odpowiedź. Jestem jednak całkiem pewien, że proponowane przeze mnie podejście jest odpowiednie dla niektórych osób (w tym mnie). Używam jednego z tych narzędzi do manipulowania indeksem kilka razy w roku.
nobar 20.04.16
1
Obecnie edytory programistyczne i środowiska IDE mogą obsługiwać graficzną manipulację indeksem. Tak przynajmniej GitHub's Atom .
nobar
1
Wolę interfejs cli niż GUI każdego dnia, nawet jeśli jest to bardziej niebezpieczne. Pozwoli mi to używać git nawet bez GUI, co sprawia mi przyjemność (zamiast zgubić się, gdy nie mogę na przykład zainstalować takich narzędzi na zdalnym serwerze). Wszystko, co mówiło, że ta odpowiedź jest całkowicie poprawna i nie zasługuje na głosowanie „elitarystów”, +1 za zapewnienie dobrej alternatywy dla gui!
SidOfc