Wie entferne ich eine Datei aus dem Index in Git?

355

Wie entferne ich eine Datei aus dem Index (= Staging-Bereich = Cache), ohne sie aus dem Dateisystem zu entfernen?

hcs42
quelle
5
Meinen Sie "auf das zurücksetzen, was vorher da war" oder "löschen, weil ich diese Datei nicht mehr will"?
Andrew Aylett
In meinem Fall ist es das gleiche, weil die Datei vorher nicht existierte ...
hcs42

Antworten:

504

Sie wollen:

git rm --cached [file]

Wenn Sie die --cachedOption weglassen , wird sie auch aus dem Arbeitsbaum gelöscht. git rmist etwas sicherer als git reset, da Sie gewarnt werden, wenn der bereitgestellte Inhalt weder mit der Spitze des Zweigs noch mit der Datei auf der Festplatte übereinstimmt. (Wenn nicht, müssen Sie hinzufügen --force.)

John Feminella
quelle
8
Dies funktioniert auch hervorragend, wenn Sie beispielsweise versehentlich einige Build-Intermediates oder lokale Konfigurationsdateien eingecheckt haben, die es nicht in Ihren .gitignore geschafft haben. Verwenden Sie git rm --cacheddiese Option, um sie aus dem Repo zu entfernen, die entsprechenden Dateien oder Verzeichnisse zu .gitignore hinzuzufügen, zu inszenieren und wie gewohnt festzuschreiben. Sie werden aus dem Repo entfernt, bleiben aber in Ihrem lokalen Baum unberührt, und Sie werden sie nicht versehentlich erneut einchecken.
Ionoclast Brigham
22
Dadurch wird die Datei auch nach dem Festschreiben und Push aus dem Repo (Remote) gelöscht.
Pulver366
6
Dadurch wird es nicht aus dem Index entfernt, sondern als im Index gelöscht markiert.
JotaBe
4
Diese Antwort ist höchstwahrscheinlich falsch, da sie eine Datei aus dem Repo entfernt (wie bereits erwähnt), was nicht das beabsichtigte Ergebnis ist.
otomo
1
Diese Lösung hat bei mir nicht funktioniert. Die angegebene Datei wurde als gelöscht markiert und dann aus dem lokalen Repo entfernt.
Paiego
134

Dies sollte eine <Datei> für Sie aufheben (ohne die Datei zu entfernen oder anderweitig zu ändern):

git reset <file>
David Underhill
quelle
6
Dadurch wird die letzte Änderung für die jeweilige Datei entfernt, sie bleibt jedoch nach dem Festschreiben und Push im Repo (Remote).
Pulver366
1
Dies ist die Antwort, nach der ich gesucht habe. Beachten Sie, dass Sie nicht angeben müssen HEAD.
Michael Dorst
Guter Punkt @MichaelDorst. Ich habe die Antwort aktualisiert, um sie wegzulassen HEAD!
David Underhill
3
git reset HEAD <file> 

zum Entfernen einer bestimmten Datei aus dem Index.

und

git reset HEAD

zum Entfernen aller indizierten Dateien.

Abdul Gafoor
quelle
1

Abhängig von Ihrem Workflow benötigen Sie diese Option möglicherweise selten genug, um eine Befehlszeilenlösung zu finden (es sei denn, Sie arbeiten aus irgendeinem Grund ohne grafische Oberfläche).

Verwenden Sie einfach eines der GUI-basierten Tools, die die Indexverwaltung unterstützen, zum Beispiel:

  • git gui <- verwendet das Tk-Fenster-Framework - ähnlich wie gitk
  • git cola <- eine modernere GUI-Oberfläche

Mit diesen können Sie Dateien per Mausklick in den Index ein- und aus dem Index verschieben. Sie unterstützen sogar das Auswählen und Verschieben von Teilen einer Datei (einzelne Änderungen) zum und vom Index.


Wie wäre es mit einer anderen Perspektive: Wenn Sie Fehler machen, während Sie einen der vorgeschlagenen, eher kryptischen Befehle verwenden:

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

... Sie haben eine echte Chance, Daten zu verlieren - oder es zumindest schwer zu finden. Wenn Sie dies nicht wirklich mit sehr hoher Frequenz tun müssen, ist die Verwendung eines GUI-Tools wahrscheinlich sicherer .


Arbeiten ohne den Index

Aufgrund der Kommentare und Abstimmungen habe ich festgestellt, dass viele Leute den Index ständig verwenden. Ich nicht. Hier ist wie:

  • Übertragen Sie meine gesamte Arbeitskopie (der typische Fall): git commit -a
  • Übernehmen Sie nur ein paar Dateien: git commit (list of files)
  • Übernehmen Sie alle bis auf einige geänderte Dateien git commit -aund ändern Sie sie dann übergit gui
  • Überprüfen Sie alle Änderungen an der Arbeitskopie grafisch: git difftool --dir-diff --tool=meld
kein Balken
quelle
@ Martin: Ich denke, es hängt von Ihrem Workflow ab. In meinem Ansatz verwende ich den Index nie direkt. Wenn ich meine Arbeit speichern möchte, mache ich nur vollständige Commits mit git commit -a. Als ich diese Frage beantwortete, war es, weil ich (einen exotischen) " inversen Kirschpickel " gemacht hatte, der Dateien in den Index für Sie einfügt, aber ich wollte eine Datei vor dem Festschreiben bearbeiten. Ich habe die Datei aus dem Index genommen, während ich sie bearbeitet habe, damit die Unterschiede so funktionieren, wie ich es gewohnt bin.
Nobar
Mein Anwendungsfall war sehr eng und in der Tat nutzlos: Erstellen Sie einen Zweig; Ordner hinzufügen, der nur für den Zweig mit Dateien gefüllt ist; zum Master wechseln; verschmelzen; ops, falscher Ordner zum Master hinzugefügt, gitignore hinzufügen; Dateien würden nicht aus dem Commit entfernt - selbstverständlich, eine bessere Lösung wäre die sofortige Verwendung rm, aber ich dachte zuerst, ein Zweigwechsel würde den ignorierten Ordner nicht zerstören. aber ... ich benutze ein Github "GUI-basiertes" Tool, das gut genug für mich ist und unterstütze einige Indexverwaltungen, außer es unterstützt dies nicht. Also, was, sollte ich 2 GUI für den engen Gebrauch verwenden? kann der Antwort immer noch nicht zustimmen.
Cregox
3
Dies ist eine ausgesprochen unpopuläre Antwort. Ich bin mir jedoch ziemlich sicher, dass der von mir vorgeschlagene Ansatz für einige Leute (mich eingeschlossen) der richtige ist. Ich benutze eines dieser Tools, um den Index einige Male pro Jahr zu bearbeiten.
Nobar
1
Heutzutage unterstützen Programmiereditoren und IDEs wahrscheinlich die grafische Indexmanipulation. Zumindest GitHubs Atom .
Nobar
1
Ich bevorzuge jeden Tag ein CLI-Interface gegenüber GUI, obwohl es gefährlicher ist. Dadurch kann ich git auch ohne GUI verwenden, was ich als beruhigend empfinde (anstatt verloren zu gehen, wenn ich solche Tools beispielsweise nicht auf einem Remote-Server installieren kann). Alles, was gesagt wurde, dass diese Antwort vollkommen gültig ist und keine "kli-elitären" Abstimmungen verdient, +1 für die Bereitstellung einer guten Gui-Alternative!
SidOfc