Wie entferne ich eine einzelne Datei aus dem Staging-Bereich (git add rückgängig machen)?

1231

Situation: Ich habe ein Git-Repository mit Dateien, die bereits im Index enthalten sind. Ich ändere mehrere Dateien, öffne Git und füge diese Dateien mit "git add" meinem Staging-Bereich hinzu.

Frage: Wie entferne ich eine dieser Dateien aus dem Staging-Bereich, aber nicht aus dem Index oder mache die Änderungen an der Datei selbst rückgängig?

PHLAK
quelle
40
Der Staging-Bereich ist der Index. Könnten Sie also vielleicht genau klären, was Sie meinen?
CB Bailey

Antworten:

1903

Wenn ich die Frage richtig verstehe, möchten Sie einfach das rückgängig machen git add, was für diese Datei gemacht wurde.

Wenn Sie eine einzelne Datei aus dem Staging-Bereich entfernen müssen , verwenden Sie

git reset HEAD -- <file>

Wenn Sie ein ganzes Verzeichnis (Ordner) aus dem Staging-Bereich entfernen müssen , verwenden Sie

git reset HEAD -- <directoryName>

Ihre Änderungen werden beibehalten. Wenn Sie git statusdie Datei ausführen , wird sie erneut als geändert, aber noch nicht bereitgestellt angezeigt.

Weitere Informationen finden Sie in der git resetManpage .

Tim Henigan
quelle
41
Danke ... Ich habe gerade bemerkt, dass dies direkt über den bereitgestellten Dateien angegeben ist. Ich schätze, ich habe so lange auf diesen Bildschirm geschaut, dass ich selektiv ausgewählt habe, was ich sehen wollte.
PHLAK
2
Dadurch werden alle meine Änderungen aufgehoben, entgegen allen Ratschlägen, die ich irgendwo erhalten habe (Manpages, hier, Freunde usw.). Ich denke immer wieder, dass es eines Tages tun wird, was beworben wird, aber nein.
rektide
6
Gibt es überhaupt eine Möglichkeit, Dateien aus dem Staging zu entfernen, wenn keine Commits für das Repo vorgenommen wurden?
Jared Forsyth
3
Ich komme immer wieder zu dieser Frage. Warum kann ich es nicht öfter positiv bewerten? :)
Puce
3
@Jared Forsyth Um eine Datei zu entfernen, die nie von der Bühne festgeschrieben wurde, verwenden Sie den Befehl, git rm --cached FILEwie in einer anderen Antwort vorgeschlagen.
Chmike
151
git rm --cached FILE

,

git rm -r --cached CVS */CVS
user335425
quelle
28
stimmt, aber es ist besser, git resethier zu verwenden , denke ich, da Sie die Option --chached möglicherweise weglassen und mit dem git rmBefehl schnell traurig werden :-) git resetWenn Sie auf der sicheren Seite sind und vergessen, "eine Option" hinzuzufügen, wird dies der Fall sein Bewahren Sie das Wechselgeld so auf, dass es für den täglichen Gebrauch "sicherer" ist (ich spreche davon git reset --hard).
Konrad 'ktoso' Malawski
20
Diese Methode ist nützlich, wenn Sie keine vorherigen Commits haben.
SomeKittens
2
git rm --cached FILEStuft das Löschen von Dateien ein, ohne die Datei aus dem Arbeitsbaum zu löschen. Dies ist anders als die Frage, bei der es um das Rückgängigmachen ging git add.
Sampo Smolander
1
Diese Antwort gibt einen Fehler aus, wenn Sie die Datei aus dem Arbeitsbaum gelöscht haben.
Samuel Robert
3
git rm --cachedwird dazu führen , dh die Datei aus dem Index entfernt wird, wird die Datei wird untracked Datei. Ich glaube nicht, dass OP das will. Bitte sehen Sie einen verwandten Thread hier: stackoverflow.com/questions/45047810/…
smwikipedia
88

git reset <file>

Funktioniert unabhängig davon, ob Sie bereits Commits durchgeführt haben oder nicht.

MTS
quelle
53

Also eine kleine Änderung an Tim Henigans Antwort: Sie müssen - vor dem Dateinamen - verwenden. Es würde so aussehen:

git reset HEAD -- <file>
GuerillaNerd
quelle
6
Was macht das --und warum hinzufügen? Ich habe git reset HEAD <file>es getan und es hat funktioniert.
Paolo
15
--ist eine Art Teiler. Falls der Dateiname unkonventionell ist, würde zB ( -foder master) git ihn als Befehlszeilenargument oder Verzweigungsname anstelle des Dateinamens interpretieren. Siehe hier
Andrew
3
Dies funktionierte bei mir, wo der Befehl ohne - nicht aufgrund fehlender vorheriger Festschreibungen für diese Datei. Vielen Dank.
Matt
17
git reset filename.txt

Wenn Sie eine Änderung in filename.txt haben, haben Sie diese versehentlich zur Stufe hinzugefügt und möchten die Datei aus dem Staging entfernen, aber die Änderungen nicht verlieren.

Vlad Cioaba
quelle
6

Wenn Sie nur eine Teilmenge der Änderungen an Ihrer Datei entfernen möchten, können Sie Folgendes verwenden:

git reset -p

oder

git reset -p <file_name>

Dieser Befehl ist im Grunde das Gegenteil von git add -p: Er entfernt nur die ausgewählten Änderungen aus dem Staging-Bereich. Ich finde es äußerst nützlich, etwas, das ich versehentlich hinzugefügt habe, zu "entfernen".

fede1024
quelle
4

Wenn Sie Dateien entfernen möchten, die einem bestimmten Muster folgen und das Sie verwenden git rm --cached, können Sie auch File-Glob-Muster verwenden.

Siehe hier .

thilinarmtb
quelle
2

Sie wollen:

  • Auswirkungen auf eine einzelne Datei

  • Datei aus dem Staging-Bereich entfernen

  • Entfernen Sie keine einzelne Datei aus dem Index

  • Machen Sie die Änderung selbst nicht rückgängig

und die Lösung ist

git reset HEAD file_name.ext

oder

git reset HEAD path/to/file/file_name.ext
Mach Nhu Vy
quelle
2

Wenn Sie dies tun git status, erklärt Git Ihnen, wie Sie die Bühne verlassen können:

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

Also git reset HEAD <file>für mich gearbeitet und die Änderungen waren unberührt.


quelle
2

Ich denke, Sie wurden wahrscheinlich mit dem Konzept des Index verwechselt , wie @CB Bailey kommentierte:

Der Staging-Bereich ist der Index.

Sie können Staging-Verzeichnis und -Index einfach als dasselbe betrachten.
Also, genau wie die Antwort von @Tim Henigan , denke ich:

Sie möchten einfach das rückgängig machen git add, was für diese Datei gemacht wurde.



Hier ist meine Antwort:

Üblicherweise gibt es zwei Möglichkeiten , um eine rückgängig zu machen Stufe Betrieb, wie andere Antworten bereits erwähnt:

git reset HEAD <file>

und

git rm --cached <file>

Aber was ist der Unterschied?

Angenommen, die Datei wurde bereitgestellt und befindet sich auch im Arbeitsverzeichnis . Verwenden git rm --cached <file>Sie diese Option, wenn Sie sie aus dem Bereitstellungsverzeichnis entfernen möchten , und behalten Sie die Datei im Arbeitsverzeichnis . Beachten Sie aber , dass dieser Vorgang wird nicht nur die Datei aus entfernen Staging - Verzeichnis , sondern markiert auch die Datei als deletedin Verzeichnis staging , wenn Sie verwenden

git status

Nach dieser Operation sehen Sie Folgendes:

        deleted:    <file>

Es ist eine Aufzeichnung des Entfernens der Datei aus dem Staging-Verzeichnis . Wenn Sie diese Aufzeichnung nicht aufbewahren und einfach einen Vorgang einer Datei in der vorherigen Phase rückgängig machen möchten, verwenden Siegit reset HEAD <file> stattdessen.


-------- ENDE DER ANTWORT --------

PS: Ich habe einige Antworten bemerkt, die erwähnt wurden:

git checkout -- <file>

Dieser Befehl gilt für Situationen, in denen die Datei bereitgestellt wurde, die Datei jedoch nach dem Bereitstellen im Arbeitsverzeichnis geändert wurde. Verwenden Sie diesen Vorgang, um die Datei im Arbeitsverzeichnis aus dem Bereitstellungsverzeichnis wiederherzustellen . Mit anderen Worten, nach diesem Vorgang treten Änderungen in Ihrem Arbeitsverzeichnis auf , NICHT in Ihrem Staging-Verzeichnis .

Wulfric Lee
quelle
2

Nach der Version 2.23hat Git den git restoreBefehl eingeführt, mit dem Sie dies tun können. Zitieren der offiziellen Dokumentation:

Stellen Sie die angegebenen Pfade im Arbeitsbaum mit einigen Inhalten aus einer Wiederherstellungsquelle wieder her. Wenn ein Pfad verfolgt wird, aber in der Wiederherstellungsquelle nicht vorhanden ist, wird er entfernt, um mit der Quelle übereinzustimmen.

Der Befehl kann auch verwendet werden, um den Inhalt im Index mit --stagedwiederherzustellen, oder um sowohl den Arbeitsbaum als auch den Index mit wiederherzustellen --staged --worktree.

So können git restore --staged <path>Sie die Datei aufrufen und entfernen, aber auch die vorgenommenen Änderungen beibehalten. Denken Sie daran, dass Sie alle Änderungen verlieren, die Sie daran vorgenommen haben, wenn die Datei nicht bereitgestellt wurde.

Mike
quelle
1

Wenn Sie Änderungen an vielen nachverfolgten Dateien vornehmen, aber nur einige davon bereitstellen möchten, führen Sie a

git add .

ist nicht immer günstig (oder empfohlen), da alle nachverfolgten Dateien bereitgestellt werden (in einigen Fällen möchten Sie Änderungen nur für sich selbst und nicht für das Remote-Repository bereitstellen).

noch ist es ideal, ein paar zu tun

git add path/to/file1 path/to/file2

Wenn Sie viele verschachtelte Verzeichnisse haben (was in den meisten Projekten der Fall ist), wird dies ärgerlich

Dann ist Git GUI hilfreich (wahrscheinlich nur, wenn ich es benutze). Öffnen Sie einfach die Git-GUI. Es werden abgestufte und nicht bereitgestellte Dateibereiche angezeigt. Wählen Sie die Dateien aus dem bereitgestellten Bereich aus, die Sie entfernen möchten, und drücken Sie

Ctrl+U (für Windows)

sie zu inszenieren.

rite2hhh
quelle
1

Für neuere Versionen von Git gibt es git restore --staged <file> .

Wenn ich eine git statusVersion mit Git mache 2.26.2.windows.1, wird dies auch zum Aufheben der Staging-Funktion empfohlen:

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

( Dieser Beitrag zeigt, dass in früheren Versionengit reset HEAD an dieser Stelle empfohlen wurde)

Ich kann empfehlen , diese Post , die Unterschiede zwischen erklären git revert, git restoreund git resetauch zusätzliche Parameter für git restore.

Ruik
quelle
0

Mein Beispiel:

$ 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

Wie Sie vielleicht bemerken

> Changes to be committed:
>       (use "git reset HEAD <file>..." to unstage)
Khang Azun
quelle
-1

Sie müssen sich im Verzeichnis der Datei befinden und dann Folgendes in das Terminal eingeben

git reset HEAD .

Es wird davon ausgegangen, dass Sie nur eine Datei zurücksetzen müssen.

nevosial
quelle
-4

Führen Sie diesen Befehl aus, um alles auf einmal zu entfernen

git reset HEAD -- .
Devendra Verma
quelle
Danach können keine Dateien mehr hinzugefügt werden.
Karl Morrison
-10

git checkout -- <file>

Es funktioniert perfekt, um Dateien aus dem Staging-Bereich zu entfernen

Juan Ramirez
quelle
4
Wie unten erwähnt, werden dadurch Änderungen an der Datei zurückgesetzt, die einen Schritt weiter gehen, als OP gehen möchte.
Stolli
git rm flie.txt --cached
Juan Ramirez
-11

In meinem Fall tue ich das

git checkout -- FILE
Maxi Capodacqua
quelle
9
Dies würde Änderungen an der Datei zurücksetzen, nicht wahr?
Martin Burch