Frage Wie rückgängig machen 'git add' vor dem Commit?


Ich habe fälschlicherweise Dateien mit folgendem Befehl zu git hinzugefügt:

git add myfile.txt

Ich bin noch nicht gelaufen git commit. Gibt es eine Möglichkeit, dies rückgängig zu machen, damit diese Dateien nicht in das Commit einbezogen werden?


Es gibt bisher 48 Antworten (einige wurden gelöscht). Bitte fügen Sie keine neue hinzu, es sei denn, Sie haben neue Informationen.


7450
2017-12-07 21:57


Ursprung


Antworten:


Sie können rückgängig machen git add bevor begehen mit

git reset <file>

Dadurch wird es aus dem aktuellen Index entfernt (die Liste "Committed"), ohne etwas anderes zu ändern.

Sie können verwenden

git reset

ohne Dateinamen, um alle fälligen Änderungen zu deaktivieren. Dies kann nützlich sein, wenn zu viele Dateien in einer angemessenen Zeit nacheinander aufgelistet werden.

In alten Versionen von Git entsprechen die obigen Befehle git reset HEAD <file> und git reset HEAD jeweils, und wird fehlschlagen, wenn HEAD ist nicht definiert (weil Sie in Ihrem Repo noch keine Commits gemacht haben) oder mehrdeutig (weil Sie eine Verzweigung namens HEAD, was eine dumme Sache ist, die du nicht tun solltest). Dies wurde in Git 1.8.2 geändertIn modernen Versionen von Git können Sie die obigen Befehle jedoch auch schon vor dem ersten Commit verwenden:

"git reset" (ohne Optionen oder Parameter) verwendet, um wann auszugeben      Sie haben keine Commits in Ihrer Geschichte, aber es gibt Ihnen jetzt      ein leerer Index (um nicht existierende Commits zu treffen, die nicht einmal aktiv sind).


8357
2017-12-07 22:30



Sie wollen:

git rm --cached <added_file_to_undo>

Argumentation:

Als ich neu war, versuchte ich es zuerst

git reset .

(um meine gesamte anfängliche Ergänzung rückgängig zu machen), nur um diese (nicht so) hilfreiche Nachricht zu erhalten:

fatal: Failed to resolve 'HEAD' as a valid ref.

Es stellt sich heraus, dass dies daran liegt, dass der HEAD ref (Zweig?) Erst nach dem ersten Commit existiert. Das heißt, Sie stoßen auf das gleiche Anfängerproblem wie ich, wenn Ihr Workflow, wie meiner, so etwas wie Folgendes ist:

  1. cd zu meinem großartigen neuen Projektverzeichnis, um Git, die neue Schärfe, auszuprobieren
  2. git init
  3. git add .
  4. git status

    ... viele Mistscrollen von ...

    => Verdammt, ich wollte das alles nicht hinzufügen.

  5. Google "undo git add"

    => finde Stapelüberlauf - yay

  6. git reset .

    => fatal: Fehler beim Auflösen von "HEAD" als gültige Referenz

Es stellt sich heraus, dass es da ist ein Fehler wurde protokolliert gegen die Unfreundlichkeit dieses in der Mailing-Liste.

Und dass die richtige Lösung in der Git-Statusausgabe war (was ich ja als "Mist" beschimpfte)

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

Und die Lösung ist tatsächlich zu verwenden git rm --cached FILE.

Beachten Sie die Warnungen an anderer Stelle hier - git rm Löscht Ihre lokale Arbeitskopie der Datei, aber nicht wenn du benutzt --cachiert. Hier ist das Ergebnis von git help rm:

--cachiert       Verwenden Sie diese Option, um Pfade nur aus dem Index zu entfernen und zu entfernen.       Arbeitsbaumdateien, ob modifiziert oder nicht, bleiben übrig.

Ich fahre fort zu benutzen

git rm --cached .

um alles zu entfernen und neu zu starten. Hat aber nicht funktioniert, denn während add . ist rekursiv, stellt sich heraus rm braucht -r rekrutieren. Seufzer.

git rm -r --cached .

Okay, jetzt bin ich wieder da, wo ich angefangen habe. Das nächste Mal werde ich verwenden -n einen Trockenlauf machen und sehen, was hinzugefügt wird:

git add -n .

Ich habe alles an einen sicheren Ort gepackt, bevor ich vertraue git help rm über die --cached nichts zerstören (und was, wenn ich es falsch geschrieben habe).


1950
2018-03-25 16:20



Wenn Sie Folgendes eingeben:

git status

git wird Ihnen sagen, was inszeniert ist, usw., einschließlich Anweisungen zum Auflösen von:

use "git reset HEAD <file>..." to unstage

Ich finde, dass Git ziemlich gute Arbeit macht, mich dazu zu bringen, in solchen Situationen das Richtige zu tun.

Hinweis: Die letzten Git Versionen (1.8.4.x) haben diese Nachricht geändert:

(use "git rm --cached <file>..." to unstage)

484
2017-12-07 23:22



Um klarzustellen: git add Verschiebt Änderungen vom aktuellen Arbeitsverzeichnis in das Bühnenbereich (Index).

Dieser Prozess wird aufgerufen Inszenierung. Also der natürlichste Befehl zu Bühne Die Änderungen (geänderte Dateien) sind offensichtlich:

git stage

git add ist nur ein leichter zu typierender Alias ​​für git stage

Schade, es gibt keine git unstage Noch git unadd Befehle. Der relevante ist schwerer zu erraten oder zu erinnern, aber ist ziemlich offensichtlich:

git reset HEAD --

Wir können dafür leicht einen Alias ​​erstellen:

git config --global alias.unadd 'reset HEAD --'
git config --global alias.unstage 'reset HEAD --'

Und schließlich haben wir neue Befehle:

git add file1
git stage file2
git unadd file2
git unstage file1

Persönlich verwende ich noch kürzere Aliase:

git a #for staging
git u #for unstaging

220
2017-09-10 20:28



Ein Zusatz zu der akzeptierten Antwort, wenn Ihre versehentlich hinzugefügte Datei riesig war, werden Sie wahrscheinlich bemerken, dass, selbst nachdem Sie sie aus dem Index mit 'git reset'scheint es immer noch Platz in der .git Verzeichnis. Da ist nichts zu befürchten, die Datei befindet sich zwar immer noch im Repository, aber nur als "loses Objekt", sie wird nicht in andere Repositories kopiert (via Klon, Push), und der Speicherplatz wird irgendwann wieder zurückgewonnen vielleicht nicht sehr bald. Wenn Sie ängstlich sind, können Sie Folgendes ausführen:

git gc --prune=now

Aktualisieren (Was folgt, ist mein Versuch, einige Verwirrung zu beseitigen, die sich aus den am meisten gewählten Antworten ergeben kann):

Also, was ist das wirklich? rückgängig machen von git add?

git reset HEAD <file> ?

oder

git rm --cached <file>?

Streng genommen, und wenn ich mich nicht irre: keiner.

git add  kann nicht rückgängig gemacht werden - Sicher, im Allgemeinen.

Erinnern wir uns zunächst an was git add <file> tut tatsächlich:

  1. Ob <file> war nicht vorher verfolgt, git add  fügt es dem Cache hinzumit seinem aktuellen Inhalt.

  2. Ob <file> war bereits verfolgt, git add  speichert den aktuellen Inhalt (Snapshot, Version) in den Cache. In GIT wird diese Aktion immer noch aufgerufen hinzufügen, (nicht einfach aktualisieren es), weil zwei verschiedene Versionen (Snapshots) einer Datei als zwei verschiedene Elemente angesehen werden: Daher fügen wir tatsächlich einen neuen Gegenstand zum Cache hinzu, um später eventuell zu committen.

Angesichts dessen ist die Frage etwas mehrdeutig:

Ich habe versehentlich Dateien mit dem Befehl hinzugefügt ...

Das OP-Szenario scheint das erste zu sein (nicht nachverfolgte Datei), wir möchten, dass das "Rückgängigmachen" die Datei (nicht nur den aktuellen Inhalt) aus den verfolgten Elementen entfernt. Ob Das ist der Fall, dann ist es in Ordnung zu laufen git rm --cached <file>.

Und wir könnten auch laufen git reset HEAD <file>. Dies ist im Allgemeinen vorzuziehen, da es in beiden Szenarien funktioniert: Es macht auch das Rückgängigmachen, wenn wir fälschlicherweise eine Version eines bereits verfolgten Objekts hinzugefügt haben.

Aber es gibt zwei Vorbehalte.

Erstens: Es gibt (wie in der Antwort darauf hingewiesen wurde) nur ein Szenario, in dem git reset HEAD funktioniert nicht, aber git rm --cached tut: ein neues Repository (keine commits). Aber das ist wirklich ein praktisch bedeutungsloser Fall.

Zweitens: Seien Sie sich dessen bewusst git reset HEAD  kann den zuvor zwischengespeicherten Dateiinhalt nicht magisch wiederherstellen, er resynchronisiert ihn einfach vom HEAD. Wenn unsere fehlgeleitete git add eine vorherige nicht festgeschriebene Version überschreiben, können wir sie nicht wiederherstellen. Genau genommen können wir das 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 lost irrevocably "version 2"
-version 1
+version 3

Natürlich ist dies nicht sehr kritisch, wenn wir nur den üblichen faulen Workflow von "git add" befolgen, nur um neue Dateien hinzuzufügen (Fall 1), und wir aktualisieren neue Inhalte über das Commit, git commit -a Befehl.


136
2018-05-18 18:05



git rm --cached . -r

wird alles, was Sie hinzugefügt haben, aus Ihrem aktuellen Verzeichnis rekursiv entfernen


85
2017-12-09 21:19



Lauf

git gui

und entfernen Sie alle Dateien manuell oder indem Sie alle auswählen und auf die Schaltfläche klicken vom Commit auflösen Taste.


77
2017-10-12 01:12



Git hat Befehle für jede vorstellbare Aktion, benötigt aber umfangreiches Wissen, um die Dinge in Ordnung zu bringen, und daher ist es bestenfalls kontraintuitiv ...

Was hast du vorher gemacht?

  • Eine Datei geändert und verwendet git add ., oder git add <file>.

Was du willst:

  • Entfernen Sie die Datei aus dem Index, behalten Sie sie jedoch versioniert und belassen Sie nicht festgeschriebene Änderungen in der Arbeitskopie:

    git reset head <file>
    
  • Setzen Sie die Datei von HEAD auf den letzten Status zurück, nehmen Sie Änderungen rückgängig und entfernen Sie sie aus dem Index:

    # Think `svn revert <file>` IIRC.
    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>
    

    Dies wird seit benötigt git reset --hard HEAD funktioniert nicht mit einzelnen Dateien.

  • Löschen <file> von Index und Versionierung, wobei die nicht versionierte Datei mit Änderungen in der Arbeitskopie beibehalten wird:

    git rm --cached <file>
    
  • Löschen <file> von Arbeitskopie und Versionierung komplett:

    git rm <file>
    

73
2018-03-29 11:14



Die Frage ist nicht klar gestellt. Der Grund ist, dass git add hat zwei Bedeutungen:

  1. Hinzufügen eines neue Datei zum Staging-Bereich, dann rückgängig machen mit git rm --cached file.
  2. Hinzufügen eines geändert Datei in den Staging-Bereich, dann rückgängig machen mit git reset HEAD file.

Im Zweifelsfall benutzen

git reset HEAD file

Weil es in beiden Fällen die erwartete Sache ist.

Warnung: wenn Sie tun git rm --cached file auf einer Datei, die war geändert (eine Datei, die vorher im Repository existierte), dann wird die Datei entfernt git commit! Es wird weiterhin in Ihrem Dateisystem vorhanden sein, aber wenn jemand anderes Ihre Festschreibung durchführt, wird die Datei aus ihrem Arbeitsbaum gelöscht.

git status wird Ihnen sagen, ob die Datei a war neue Datei oder geändert:

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

    new file:   my_new_file.txt
    modified:   my_modified_file.txt

62
2018-01-16 19:54



Rückgängig machen eine Datei, die bereits hinzugefügt wurde, ist ziemlich einfach mit Git, zum Zurücksetzen myfile.txt welche bereits hinzugefügt haben, verwenden:

git reset HEAD myfile.txt

Erklären:

Nachdem Sie unerwünschte Dateien inszeniert haben, können Sie dies rückgängig machen git reset, Head ist der Kopf Ihrer Datei in local und der letzte Parameter ist der Name Ihrer Datei.

Ich erstelle die Schritte in dem folgenden Bild für Sie detaillierter, einschließlich aller Schritte, die in diesen Fällen auftreten können:

git reset HEAD


60
2018-06-28 10:43