Wie entferne ich eine Datei aus dem Staging-Bereich (= Index = Cache) in Git?
Lesezeit: 5 Minuten
hcs42
BEARBEITEN Diese Frage kann auf zwei Arten verstanden werden, und die optimale Antwort ist in beiden Fällen unterschiedlich.
Frage 1: Ich habe a hinzugefügt zuvor ungetrackte Datei zum Bereitstellungsbereich. Wie kann ich diese Datei aus dem Staging-Bereich entfernen, ohne sie aus dem Dateisystem zu entfernen?
Antwort 1: Verwenden Sie den folgenden Befehl, wie in der Antwort von John Feminella beschrieben:
git rm --cached <file>
Frage 2: Ich habe a geändert Datei bereits verfolgt, und fügte meine Änderungen zum Staging-Bereich hinzu. Wie kann ich meine Änderungen aus dem Bereitstellungsbereich entfernen? Dh, wie kann ich meine Änderungen in der Datei rückgängig machen?
Antwort 2: Verwenden Sie den folgenden Befehl, wie in der Antwort von David Underhill beschrieben:
git reset <file>
Meinst du “zurücksetzen auf das, was vorher da war” oder “löschen, weil ich diese Datei nicht mehr will”?
– Andreas Aylett
8. Februar 10 um 17:12 Uhr
In meinem Fall ist es das gleiche, weil die Datei vorher nicht existierte …
– hcs42
8. Februar 10 um 17:15 Uhr
@ hcs42 Die akzeptierte Antwort ist falsch und führt für viele Menschen zu gelöschten Dateien. Die zweitbeliebteste Antwort (git reset <file>) ist richtig. Wäre es Ihnen möglich, das grüne Häkchen auf die richtige Antwort zu setzen?
– Martin Jambon
2. Juli 21 um 0:45 Uhr
@MartinJambon Danke, dass du das Problem hervorgehoben hast, das einige Leute hatten. Das Problem war, dass meine Frage auf zwei Arten verstanden werden konnte. Die akzeptierte Antwort ist perfekt für die Frage, die ich hatte, aber sie brachte einige Leute in Schwierigkeiten, die eine Antwort auf eine andere Frage wollten. Ich habe die Frage so bearbeitet, dass sie beide Fragen enthält.
– hcs42
3. Juli 21 um 7:03 Uhr
@hcs42 super, danke!
– Martin Jambon
5. Juli 21 um 9:21 Uhr
Johannes Feminella
Sie wollen:
git rm --cached [file]
Wenn Sie die weglassen --cached Option, wird es auch aus dem Arbeitsbaum gelöscht. git rm ist 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.)
Dies funktioniert auch hervorragend, wenn Sie z. B. versehentlich einige Build-Zwischenprodukte oder lokale Konfigurationsdateien eingecheckt haben, die es nicht in Ihre .gitignore-Datei geschafft haben. benutzen git rm --cached Um sie aus dem Repo zu entfernen, fügen Sie die relevanten Dateien oder Verzeichnisse zu .gitignore hinzu, stellen Sie sie bereit und übergeben Sie sie wie gewohnt. Sie werden aus dem Repo entfernt, bleiben aber in Ihrem lokalen Baum unberührt, und Sie werden sie nicht versehentlich wieder einchecken.
– Ionoklast Brigham
7. Dezember 14 um 6:27 Uhr
Dadurch wird die Datei auch aus dem Repo (Remote) gelöscht, nachdem Sie festgeschrieben und gepusht haben.
– Pulver366
30. Juni 16 um 6:21 Uhr
Dadurch wird es nicht aus dem Index entfernt, sondern im Index als gelöscht markiert.
– JotaBe
24. Juli 19 um 8:55 Uhr
Diese Antwort ist höchstwahrscheinlich falsch, da sie eine Datei aus dem Repo entfernt (wie @powder366 bereits erwähnt), was nicht das beabsichtigte Ergebnis ist.
– otomo
24. September 19 um 10:16 Uhr
Diese Lösung hat bei mir nicht funktioniert. Es markiert die angegebene Datei als gelöscht und entfernt sie dann aus dem lokalen Repo.
– paiego
18. November 19 um 22:00 Uhr
David Unterhill
Dies sollte eine für Sie aus der Staging-Umgebung entfernen (ohne die Datei zu entfernen oder anderweitig zu ändern):
git reset <file>
Dadurch wird die letzte Änderung für die spezifische Datei entfernt, aber sie bleibt nach dem Commit und Push im Repo (Remote).
– Pulver366
30. Juni 16 um 6:25 Uhr
Das ist die Antwort, nach der ich gesucht habe. Beachten Sie, dass Sie nichts angeben müssen HEAD.
– Michael Dorst
6. November 19 um 22:31 Uhr
Guter Punkt @MichaelDorst. Ich habe die Antwort aktualisiert, um sie wegzulassen HEAD!
– David Unterberg
7. November 19 um 2:11 Uhr
git reset HEAD <file>
zum Entfernen einer bestimmten Datei aus dem Index.
und
git reset HEAD
zum Entfernen aller indizierten Dateien.
Blue Ray
Benutz nur git rm --cached [file] um eine Datei aus dem Index zu entfernen.
git reset <filename> kann verwendet werden, um hinzugefügte Dateien aus dem Index zu entfernen, sofern die Dateien vorhanden sind nie begangen.
HINWEIS:git reset First.txt hat nach dem Commit keine Auswirkung auf den Index.
Was mich zum Thema bringt git restore --staged <file>. Es kann verwendet werden, um (vermutlich nach dem ersten Commit) hinzugefügte Dateien aus dem Index zu entfernen, sofern die Dateien vorhanden sind nie begangen.
% git add Second.txt
% git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: Second.txt
% git ls-files
First.txt
Second.txt
% git restore --staged Second.txt
% git ls-files
First.txt
% git add Second.txt
% git commit -m "Second"
% git status
On branch master
nothing to commit, working tree clean
% git ls-files
First.txt
Second.txt
Desktop/Test% git restore --staged .
Desktop/Test% git ls-files
First.txt
Second.txt
Desktop/Test% git reset .
Desktop/Test% git ls-files
First.txt
Second.txt
% git rm --cached -r .
rm 'First.txt'
rm 'Second.txt'
% git ls-files
tl;dr Schauen Sie sich die letzten 15 Zeilen an. Wenn Sie nicht mit erstem Commit, zweitem Commit, vor Commit, nach Commit verwechselt werden wollen, verwenden Sie immer git rm --cached [file]
Brent Bradburn
Abhängig von Ihrem Arbeitsablauf kann dies die Art von Dingen sein, die Sie selten genug benötigen, dass es wenig Sinn macht, 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-Windowing-Framework -- ähnlicher Stil wie gitk
git cola <-- eine modernere GUI-Oberfläche
Mit diesen können Sie Dateien per Point-and-Click in und aus dem Index verschieben. Sie unterstützen sogar das Auswählen und Verschieben von Teilen einer Datei (einzelne Änderungen) in den und aus dem Index.
Wie wäre es mit einer anderen Perspektive: Wenn Sie bei der Verwendung eines der vorgeschlagenen, eher kryptischen Befehle Fehler machen:
git rm --cached [file]
git reset HEAD <file>
… besteht die reale Chance, dass Daten verloren gehen oder zumindest schwer wiederzufinden sind. Sofern Sie dies nicht wirklich mit sehr hoher Häufigkeit tun müssen, Die Verwendung eines GUI-Tools ist wahrscheinlich sicherer.
Arbeiten ohne Index
Aufgrund der Kommentare und Abstimmungen habe ich festgestellt, dass viele Leute den Index ständig verwenden. Ich nicht. Hier ist wie:
Übertrage meine gesamte Arbeitskopie (der typische Fall): git commit -a
Committen Sie nur ein paar Dateien: git commit (list of files)
Übertragen Sie alle bis auf ein paar geänderte Dateien: git commit -a dann ändern über git gui
Grafische Überprüfung aller Änderungen an der Arbeitskopie: git difftool --dir-diff --tool=meld
@Martin: Ich denke, es hängt von Ihrem Workflow ab. Bei meinem Ansatz verwende ich den Index nie direkt. Wenn ich meine Arbeit speichern möchte, mache ich einfach vollständige Commits mit git commit -a. Als ich diese Frage beantwortete, lag das daran, dass ich (einen exotischen) “inversen Rosinenpick” gemacht hatte, der Dateien für Sie in den Index legt, aber ich wollte eine Datei vor dem Commit bearbeiten. Ich habe die Datei aus dem Index entfernt, während ich sie bearbeitet habe, damit Diffs so funktionieren, wie ich es gewohnt bin.
– Brent Bradburn
4. Oktober 15 um 16:00 Uhr
Mein Anwendungsfall war sehr eng und in der Tat nutzlos: Erstellen Sie einen Zweig; fügen Sie einen Ordner hinzu, der nur für Zweige mit Dateien gefüllt ist; auf Master umschalten; verschmelzen; ops, falschen Ordner zum Master hinzugefügt, füge ihn zu gitignore hinzu; Dateien würden nicht aus dem Commit entfernt — zugegeben, eine bessere Lösung wäre einfach zu verwenden rm sofort, aber ich dachte zuerst, dass das Wechseln von Zweigen das nicht töten würde ignoriert Mappe. aber… Ich verwende das “GUI-basierte” Github-Tool, das für mich gut genug ist, und unterstützt etwas Indexverwaltung, außer dass es dies nicht unterstützt. na und, sollte ich 2 GUIs für eine enge Nutzung verwenden? kann der Antwort immer noch nicht zustimmen.
– Cregox
23. Februar 16 um 20:41 Uhr
Das 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 ein paar Mal pro Jahr zu manipulieren.
– Brent Bradburn
20. April 16 um 15:21 Uhr
Heutzutage unterstützen Programmiereditoren und IDEs wahrscheinlich die grafische Indexmanipulation. Zumindest die von GitHub Atom tut.
– Brent Bradburn
10. Dezember 18 um 1:15 Uhr
Ich bevorzuge jeden Tag eine CLI-Schnittstelle gegenüber einer GUI, obwohl es gefährlicher ist. Dadurch kann ich Git auch ohne GUI verwenden, was ich beruhigend finde (anstatt verloren zu gehen, wenn ich solche Tools beispielsweise nicht auf einem Remote-Server installieren kann). Alles in allem ist diese Antwort absolut gültig und verdient keine “cli-elitären” Downvotes, +1 für die Bereitstellung einer guten GUI-Alternative!
– SidOfc
2. Mai 20 um 10:22 Uhr
Nach meiner bescheidenen Meinung und meiner Arbeitserfahrung mit Git ist Staging Area nicht dasselbe wie Index. Ich kann mich natürlich irren, aber wie gesagt, meine Erfahrung mit der Verwendung von Git und meine Logik sagen mir, dass dieser Index eine Struktur ist, die Ihren Änderungen an Ihrem Arbeitsbereich (lokales Repository) folgt, die nicht durch Ignorieren von Einstellungen und Staging-Bereich ausgeschlossen werden ist es, Dateien zu behalten, deren Commit bereits bestätigt wurde, auch bekannt als Dateien im Index, für die der Befehl add ausgeführt wurde. Sie bemerken und erkennen diesen “kleinen” Unterschied nicht, weil Sie ihn verwenden git commit -a -m "comment"
Hinzufügen von indizierten und zwischengespeicherten Dateien zum Stagingbereich und Festschreiben in einem Befehl oder zu häufiges Verwenden von IDEs wie IDEA dafür. Und Cache ist das, was Änderungen in indizierten Dateien speichert. Wenn Sie eine Datei aus dem Index entfernen möchten, die zuvor noch nicht zum Bereitstellungsbereich hinzugefügt wurde, passen die zuvor vorgeschlagenen Optionen zu Ihnen, aber … Wenn Sie dies bereits getan haben, müssen Sie verwenden
Git restore --staged <file>
Und bitte fragen Sie mich nicht, wo ich vor 10 Jahren war … Ich habe Sie vermisst, diese Antwort ist für weitere Generationen)
@Martin: Ich denke, es hängt von Ihrem Workflow ab. Bei meinem Ansatz verwende ich den Index nie direkt. Wenn ich meine Arbeit speichern möchte, mache ich einfach vollständige Commits mit git commit -a. Als ich diese Frage beantwortete, lag das daran, dass ich (einen exotischen) “inversen Rosinenpick” gemacht hatte, der Dateien für Sie in den Index legt, aber ich wollte eine Datei vor dem Commit bearbeiten. Ich habe die Datei aus dem Index entfernt, während ich sie bearbeitet habe, damit Diffs so funktionieren, wie ich es gewohnt bin.
– Brent Bradburn
4. Oktober 15 um 16:00 Uhr
Mein Anwendungsfall war sehr eng und in der Tat nutzlos: Erstellen Sie einen Zweig; fügen Sie einen Ordner hinzu, der nur für Zweige mit Dateien gefüllt ist; auf Master umschalten; verschmelzen; ops, falschen Ordner zum Master hinzugefügt, füge ihn zu gitignore hinzu; Dateien würden nicht aus dem Commit entfernt — zugegeben, eine bessere Lösung wäre einfach zu verwenden rm sofort, aber ich dachte zuerst, dass das Wechseln von Zweigen das nicht töten würde ignoriert Mappe. aber… Ich verwende das “GUI-basierte” Github-Tool, das für mich gut genug ist, und unterstützt etwas Indexverwaltung, außer dass es dies nicht unterstützt. na und, sollte ich 2 GUIs für eine enge Nutzung verwenden? kann der Antwort immer noch nicht zustimmen.
– Cregox
23. Februar 16 um 20:41 Uhr
Das 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 ein paar Mal pro Jahr zu manipulieren.
– Brent Bradburn
20. April 16 um 15:21 Uhr
Heutzutage unterstützen Programmiereditoren und IDEs wahrscheinlich die grafische Indexmanipulation. Zumindest die von GitHub Atom tut.
– Brent Bradburn
10. Dezember 18 um 1:15 Uhr
Ich bevorzuge jeden Tag eine CLI-Schnittstelle gegenüber einer GUI, obwohl es gefährlicher ist. Dadurch kann ich Git auch ohne GUI verwenden, was ich beruhigend finde (anstatt verloren zu gehen, wenn ich solche Tools beispielsweise nicht auf einem Remote-Server installieren kann). Alles in allem ist diese Antwort absolut gültig und verdient keine “cli-elitären” Downvotes, +1 für die Bereitstellung einer guten GUI-Alternative!
– SidOfc
2. Mai 20 um 10:22 Uhr
.
7590400cookie-checkWie entferne ich eine Datei aus dem Staging-Bereich (= Index = Cache) in Git?yes
Meinst du “zurücksetzen auf das, was vorher da war” oder “löschen, weil ich diese Datei nicht mehr will”?
– Andreas Aylett
8. Februar 10 um 17:12 Uhr
In meinem Fall ist es das gleiche, weil die Datei vorher nicht existierte …
– hcs42
8. Februar 10 um 17:15 Uhr
@ hcs42 Die akzeptierte Antwort ist falsch und führt für viele Menschen zu gelöschten Dateien. Die zweitbeliebteste Antwort (
git reset <file>
) ist richtig. Wäre es Ihnen möglich, das grüne Häkchen auf die richtige Antwort zu setzen?– Martin Jambon
2. Juli 21 um 0:45 Uhr
@MartinJambon Danke, dass du das Problem hervorgehoben hast, das einige Leute hatten. Das Problem war, dass meine Frage auf zwei Arten verstanden werden konnte. Die akzeptierte Antwort ist perfekt für die Frage, die ich hatte, aber sie brachte einige Leute in Schwierigkeiten, die eine Antwort auf eine andere Frage wollten. Ich habe die Frage so bearbeitet, dass sie beide Fragen enthält.
– hcs42
3. Juli 21 um 7:03 Uhr
@hcs42 super, danke!
– Martin Jambon
5. Juli 21 um 9:21 Uhr