579 Stimmen

Wie kann man eine große Anzahl von Dateien entsperren, ohne den Inhalt zu löschen?

Ich habe versehentlich eine Menge temporärer Dateien mit git add -A

Ich konnte die Dateien mit den folgenden Befehlen entzerren und den schmutzigen Index entfernen.

git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

Die oben genannten Befehle sind in der Datei git help rm . Aber leider wurden auch meine Dateien bei der Ausführung gelöscht, obwohl ich die Cache-Option aktiviert hatte. Wie kann ich den Index löschen, ohne den Inhalt zu verlieren?

Außerdem wäre es hilfreich, wenn jemand erklären könnte, wie dieser Rohrbetrieb funktioniert.

1218voto

tiz.io Punkte 12092

git reset

Wenn Sie nur einen übereifrigen "git add"-Lauf rückgängig machen wollen:

git reset

Ihre Änderungen werden nicht mehr gespeichert und Sie können sie nach Belieben wieder einfügen.


NICHT LAUFEN git reset --hard .

Dabei werden nicht nur die hinzugefügten Dateien entfernt, sondern auch alle Änderungen, die Sie in Ihrem Arbeitsverzeichnis vorgenommen haben, rückgängig gemacht. Wenn Sie neue Dateien im Arbeitsverzeichnis erstellt haben, wird es wird nicht sie jedoch löschen.

39voto

sehe Punkte 346808

Wenn Sie ein unberührtes Repository haben (oder HEAD nicht gesetzt ist) [1] könnten Sie einfach

rm .git/index

Dazu müssen Sie natürlich die Dateien neu hinzufügen, die Sie hat hinzugefügt werden sollen.


[1] Beachten Sie (wie in den Kommentaren erklärt), dass dies normalerweise nur passiert, wenn das Projektarchiv brandneu ist ("pristine") oder wenn keine Übertragungen vorgenommen wurden. Genauer gesagt, immer dann, wenn es keinen Checkout oder Work-Tree gibt.

Ich wollte es nur deutlicher machen :)

19voto

Amber Punkte 473552

Verwenden Sie git reset HEAD um den Index zurückzusetzen, ohne Dateien zu löschen. (Wenn Sie nur eine bestimmte Datei im Index zurücksetzen wollen, können Sie git reset HEAD -- /path/to/file dies zu tun.)

Der Pipe-Operator nimmt in einer Shell die stdout des Prozesses auf der linken Seite und übergibt ihn als stdin zum Prozess auf der rechten Seite. Es ist im Wesentlichen das Äquivalent von:

$ proc1 > proc1.out
$ proc2 < proc1.out
$ rm proc1.out

aber stattdessen ist es $ proc1 | proc2 kann der zweite Prozess mit dem Abrufen von Daten beginnen, bevor der erste mit der Ausgabe fertig ist, und es ist keine eigentliche Datei beteiligt.

17voto

prosoitos Punkte 5811

Aktualisierung 2019

Wie von anderen in verwandten Fragen hervorgehoben (siehe aquí , aquí , aquí , aquí , aquí , aquí y aquí ), können Sie jetzt eine Datei mit git restore --staged <file> .

Um alle Dateien in Ihrem Projekt freizugeben, führen Sie den folgenden Befehl von der Wurzel des Repository aus (der Befehl ist rekursiv):

git restore --staged .

Wenn Sie nur die Dateien eines Verzeichnisses entzerren wollen, navigieren Sie zu diesem Verzeichnis, bevor Sie die obigen Befehle oder run ausführen:

git restore --staged <directory-path>

Notas

  • git restore wurde eingeführt in Juli 2019 und in Version 2.23 veröffentlicht.
    Mit dem --staged Flag, wird der Inhalt des Arbeitsbaums von HEAD wiederhergestellt (also das Gegenteil von git add und löscht keine Änderungen).

  • Dies ist ein neuer Befehl, aber das Verhalten der alten Befehle bleibt unverändert. So werden die älteren Antworten mit git reset o git reset HEAD sind nach wie vor vollkommen gültig.

  • Bei der Ausführung git status mit staged uncommitted file(s), dies ist nun das, was Git vorschlägt, um unstage file(s) zu verwenden (anstelle von git reset HEAD <file> wie es vor v2.23 der Fall war).

11voto

Bijan Punkte 6341
git stash && git stash pop

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X