Entfernen Sie eine gelöschte Datei in Git

504

Um Änderungen an einer Datei zu verwerfen, gehen Sie normalerweise wie folgt vor:

git checkout -- <file>

Was passiert, wenn die Änderung, die ich verwerfen möchte, das Löschen der Datei ist? Die obige Zeile würde einen Fehler ergeben:

error: pathspec '<file>' did not match any file(s) known to git.

Welcher Befehl stellt diese einzelne Datei wieder her, ohne andere Änderungen rückgängig zu machen?

Bonuspunkt: Was ist auch, wenn die Änderung, die ich verwerfen möchte, das Hinzufügen einer Datei ist? Ich würde gerne wissen, wie ich diese Veränderung auch aufheben kann.

Lurscher
quelle
1
Das Verwerfen von Änderungen und das Aufheben der Bereitstellung sind zwei verschiedene Dinge, die Sie versuchen zu tun?
Andrew Marshall
1
Dies sind zwei verschiedene Fragen und Probleme in einem Beitrag. Dies macht die Antworten auch viel und unnötig verwirrend.
David Sopko

Antworten:

779

Angenommen Sie wollen die Auswirkungen rückgängig zu machen git rm <file>oder rm <file>gefolgt von git add -Aoder etwas ähnliches:

# this restores the file status in the index
git reset -- <file>
# then check out a copy from the index
git checkout -- <file>

Zum Rückgängigmachen reicht git add <file>die erste Zeile oben aus, vorausgesetzt, Sie haben noch keine Festschreibung vorgenommen.

Twalberg
quelle
70
Das --ist der Schlüssel. git reset <file>funktioniert nicht, was mich hierher gebracht hat.
2
Warum ist end-of-options-markernur im Fall der gelöschten Datei erforderlich?
Haridsv
5
@handsv Es ist nicht unbedingt erforderlich (Sie können es auch alternativ tun git reset HEAD <file>, was gleichwertig ist), git resetbehandelt jedoch das erste Argument zuvor end-of-options-markerals Referenznamen und nicht als Dateinamen. Könnte es etwas flexibler geschrieben werden? Wahrscheinlich. Warum war es nicht? Wahrscheinlich wissen nur die Entwickler sicher.
Twalberg
2
@twalberg git reset filenamefunktioniert gut für nicht gelöschte Dateien.
Brian Gordon
1
@ AaronMahan - kannst du bitte den Unterschied zwischen git reset <file>und erklären git reset -- <file>. Es fällt mir schwer, auf Google eine Antwort darauf zu finden.
Neeraj B.
56

Beide Fragen werden in beantwortet git status.

Um das Hinzufügen einer neuen Datei zu beenden, verwenden Sie git rm --cached filename.ext

# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   test

Um das Löschen einer Datei aufzuheben, verwenden Sie git reset HEAD filename.ext

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

Auf der anderen Seite werden git checkout --niemals nicht inszenierte Änderungen verworfen.

seppo0010
quelle
5
Ich sehe den Hinweis für eine gelöschte Datei in Git 1.7.2.5 unter Debian nicht.
Tripleee
Schön, git statuszitiert zu sehen ; zeigt Benutzern jetzt und beim nächsten Mal eine Möglichkeit zur Selbsthilfe und für den Fall, dass Informationen in zukünftigen Git-Versionen hinzugefügt oder aktualisiert werden.
Will Cain
Das ist falsch. "Zu verpflichtende Änderungen" sehen Sie vor dem git reset. Nach dem sehen git resetSie "Geändert, aber nicht aktualisiert", was anscheinend "Änderungen nicht inszeniert" in der Muttersprache der Git-Autoren bedeutet. Noch wichtiger ist, dass das ganze Dogma über "Git-Status sagt dir alles, was du weißt" eine Lüge ist. (Manager, die sagen, dass sie die Zeit der Leute verschwenden und entlassen werden sollten.)
personal_cloud
11

Die Antworten auf Ihre beiden Fragen hängen zusammen. Ich werde mit dem zweiten beginnen:

Sobald Sie eine Datei bereitgestellt haben (häufig mit git add, obwohl einige andere Befehle die Änderungen implizit ebenfalls bereitstellen git rm), können Sie diese Änderung mit zurücksetzen git reset -- <file>.

In Ihrem Fall müssen Sie git rmdie Datei entfernt haben. Dies entspricht dem einfachen Entfernen rmund dem anschließenden Staging dieser Änderung. Wenn Sie es zuerst mit der Bühne entfernen, können git reset -- <file>Sie es mit wiederherstellen git checkout -- <file>.

Ben Jackson
quelle
7

Wenn es bereitgestellt und festgeschrieben wurde, wird die Datei durch Folgendes zurückgesetzt:

git reset COMMIT_HASH file_path
git checkout COMMIT_HASH file_path
git add file_path

Dies funktioniert für eine Löschung, die mehrere Commits zuvor durchgeführt hat.

Michaeldever
quelle
1
Es ist effizienter zugit revert COMMIT_HASH
Flair
2

Ab Git v2.23 haben Sie eine andere Option:

git restore --staged -- <file>

Kreempuff
quelle