Eine Ergänzung zur akzeptierten Antwort: Wenn Ihre irrtümlich hinzugefügte Datei sehr groß war, werden Sie wahrscheinlich feststellen, dass sie auch nach dem Entfernen aus dem Index mit ' git reset
', scheint es noch immer einen Platz in der .git
Verzeichnis.
Dies ist kein Grund zur Beunruhigung; die Datei befindet sich zwar noch im Repository, aber nur als "loses Objekt". Sie wird nicht in andere Repositories kopiert (via clone, push), und der Platz wird irgendwann zurückgewonnen - wenn auch vielleicht nicht sehr bald. Wenn Sie besorgt sind, können Sie es ausführen:
git gc --prune=now
Update (im Folgenden versuche ich, einige Unklarheiten zu beseitigen, die sich aus den am meisten hochgestimmten Antworten ergeben können):
Welches ist also das wahre rückgängig machen de git add
?
git reset HEAD <file>
?
ou
git rm --cached <file>
?
Streng genommen, und wenn ich mich nicht irre: keine .
git add
kann nicht rückgängig gemacht werden - sicher, im Allgemeinen.
Erinnern wir uns zunächst daran, was git add <file>
tatsächlich tut:
-
Si <file>
war bisher nicht verfolgt , git add
fügt es dem Cache hinzu mit ihrem aktuellen Inhalt.
-
Si <file>
war bereits verfolgt , git add
speichert den aktuellen Inhalt (Snapshot, Version) in den Cache. In Git heißt diese Aktion immer noch hinzufügen. (nicht nur Update it), da zwei verschiedene Versionen (Snapshots) einer Datei als zwei verschiedene Elemente betrachtet werden: Wir fügen also tatsächlich ein neues Element in den Cache ein, das später übertragen wird.
Vor diesem Hintergrund ist die Frage etwas zweideutig:
Ich habe versehentlich Dateien mit dem Befehl...
Das Szenario des Auftraggebers scheint das erste zu sein (nicht verfolgte Datei), wir wollen, dass das "Rückgängigmachen" die Datei (nicht nur den aktuellen Inhalt) aus den verfolgten Elementen entfernt. Wenn dies der Fall ist, dann ist es in Ordnung, die git rm --cached <file>
.
Und wir könnten auch git reset HEAD <file>
. Dies ist im Allgemeinen vorzuziehen, da es in beiden Szenarien funktioniert: Es ermöglicht auch das Rückgängigmachen, wenn wir fälschlicherweise eine Version eines bereits verfolgten Artikels hinzugefügt haben.
Es gibt jedoch zwei Vorbehalte.
Erstens: Es gibt (wie in der Antwort dargelegt) nur ein Szenario, in dem git reset HEAD
funktioniert nicht, aber git rm --cached
macht: ein neues Repository (keine Übertragungen). Aber das ist wirklich ein praktisch irrelevanter Fall.
Zweitens: Seien Sie sich bewusst, dass git reset HEAD
kann den zuvor zwischengespeicherten Dateiinhalt nicht auf magische Weise wiederherstellen, sondern synchronisiert ihn nur erneut mit dem HEAD. Wenn unsere fehlgeleitete git add
eine frühere Staged-Uncommitted-Version überschrieben hat, können wir sie nicht wiederherstellen. Aus diesem Grund können wir streng genommen [*] nicht rückgängig machen.
Beispiel:
$ git init
$ echo "version 1" > file.txt
$ git add file.txt # First add of file.txt
$ git commit -m 'first commit'
$ echo "version 2" > file.txt
$ git add file.txt # Stage (don't commit) "version 2" of file.txt
$ git diff --cached file.txt
-version 1
+version 2
$ echo "version 3" > file.txt
$ git diff file.txt
-version 2
+version 3
$ git add file.txt # Oops we didn't mean this
$ git reset HEAD file.txt # Undo?
$ git diff --cached file.txt # No dif, of course. stage == HEAD
$ git diff file.txt # We have irrevocably lost "version 2"
-version 1
+version 3
Natürlich ist dies nicht sehr kritisch, wenn wir dem üblichen faulen Arbeitsablauf folgen und "git add" nur für das Hinzufügen neuer Dateien verwenden (Fall 1) und neue Inhalte über die Übergabe aktualisieren, git commit -a
Befehl.
* (Edit: das obige ist praktisch korrekt, aber es gibt immer noch ein paar leicht hakelige/umständliche Wege, um Änderungen wiederherzustellen, die bereitgestellt, aber nicht übertragen und dann überschrieben wurden - siehe die Kommentare von Johannes Matokic und iolsmit)
50 Stimmen
Beginnend mit Git v1.8.4 werden alle folgenden Antworten, die
HEAD
ohead
können nun@
anstelle vonHEAD
stattdessen. Siehe diese Antwort (letzter Abschnitt) um zu erfahren, warum Sie das tun können.5 Stimmen
Ich habe eine kleine Übersicht erstellt, die alle Möglichkeiten zum Aufheben einer Datei zeigt: stackoverflow.com/questions/6919121/
8 Stimmen
Wenn Sie Eclipse verwenden, ist es so einfach wie das Entfernen der Markierung der Dateien im Dialogfeld "Übertragen".
2 Stimmen
Dies ist eine großartige Ressource direkt von Github: Wie man (fast) alles mit Git rückgängig macht
3 Stimmen
Bevor Sie eine neue Antwort schreiben, bedenken Sie, dass es bereits mehr als 25 Antworten auf diese Frage gibt. Vergewissern Sie sich, dass Ihre Antwort einen Beitrag leistet, der nicht in den vorhandenen Antworten enthalten ist
0 Stimmen
Ich schaffe das immer, indem ich
git reset <file_name>
. Weitere Informationen finden Sie unter dieser Artikel .0 Stimmen
Wenn Leser die grafische Benutzeroberfläche verwenden möchten, können Sie mit der rechten Maustaste auf eine Datei klicken und auf "Zurücksetzen" oder "Unstage" klicken.
0 Stimmen
git rm --cached <file>
entschärft und entschärft (zum Entfernen bei der nächsten Übertragung markiert) eine bestimmte Datei, währendgit reset HEAD <file>
nur unstages die Datei0 Stimmen
Für Leute, die mit großen Repos arbeiten, können Sie auch einfach den Git-Hinzufügungsprozess abbrechen und es wird automatisch zurückgesetzt.