Ich habe versehentlich Dateien mit dem folgenden Befehl zu git hinzugefügt:
git add myfile.txt
Ich habe git commit
noch nicht ausgeführt. Gibt es eine Möglichkeit, dies rückgängig zu machen, damit diese Dateien nicht in das Commit einbezogen werden?
Sie können git add
rückgängig machen, bevor Sie mit bestätigen
git reset <file>
dadurch wird es aus dem aktuellen Index (der Liste der zu übermittelnden Daten) entfernt, ohne dass etwas anderes geändert wird.
Sie können verwenden
git reset
ohne Dateinamen, um alle fälligen Änderungen rückgängig zu machen. Dies kann nützlich sein, wenn zu viele Dateien in angemessener Zeit nacheinander aufgelistet werden müssen.
In alten Git-Versionen entsprechen die obigen Befehle git reset HEAD <file>
und git reset HEAD
und schlagen fehl, wenn HEAD
undefiniert ist (weil Sie in Ihrem Repo noch keine Commits vorgenommen haben). oder mehrdeutig (weil Sie einen Zweig namens HEAD
erstellt haben, was eine dumme Sache ist, die Sie nicht tun sollten). Dies wurde in Git 1.8.2 geändert , sodass Sie in modernen Versionen von Git die obigen Befehle verwenden können, bevor Sie das erste Commit ausführen:
"git reset" (ohne Optionen oder Parameter) wurde verwendet, um Fehler zu beheben, wenn Sie keine Commits in Ihrem Verlauf haben, aber es gibt Ihnen jetzt einen leeren Index (um nicht existierenden Commits zu entsprechen, bei denen Sie noch nicht einmal aktiv sind).
Sie wollen:
git rm --cached <added_file_to_undo>
Argumentation:
Als ich neu darin war, habe ich es zuerst versucht
git reset .
(um mein gesamtes anfängliches Hinzufügen 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 (branch?) Erst nach dem ersten Festschreiben vorhanden ist. Das heißt, Sie werden auf dasselbe Anfängerproblem stoßen wie ich, wenn Ihr Arbeitsablauf wie meiner etwa so aussah:
git init
git add .
git status
... viele Schriftrollen von ...
=> Verdammt, ich wollte das alles nicht hinzufügen.
google "git add rückgängig machen"
=> Stack Overflow finden - yay
git reset .
=> fatal: 'HEAD' konnte nicht als gültige Referenz aufgelöst werden.
Es stellt sich außerdem heraus, dass ein Fehler protokolliert gegen die Hilfslosigkeit dieses in der Mailingliste ist.
Und dass die richtige Lösung genau dort in der Git-Statusausgabe war (was ich ja als 'Mist' beschönigt habe)
... # Changes to be committed: # (use "git rm --cached <file>..." to unstage) ...
Und die Lösung besteht tatsächlich darin, git rm --cached FILE
zu verwenden.
Beachten Sie die Warnungen an anderer Stelle hier - git rm
löscht Ihre lokale Arbeitskopie der Datei, aber nicht , wenn Sie - cached . Hier ist das Ergebnis von git help rm
:
--cached Verwenden Sie diese Option, um nur Pfade aus dem Index zu entfernen. Geänderte oder nicht geänderte Arbeitsbaumdateien bleiben erhalten.
Ich fahre fort zu verwenden
git rm --cached .
um alles zu entfernen und von vorne zu beginnen. Hat allerdings nicht funktioniert, da add .
zwar rekursiv ist, rm
jedoch -r
für die Rekursion benötigt. Seufzer.
git rm -r --cached .
Okay, jetzt bin ich wieder da, wo ich angefangen habe. Das nächste Mal werde ich -n
verwenden, um einen Probelauf durchzuführen und zu sehen, was hinzugefügt wird:
git add -n .
Ich habe alles an einen sicheren Ort gepackt, bevor ich git help rm
vertraue, dass --cached
nichts zerstört (und was ist, wenn ich es falsch geschrieben habe).
Wenn Sie Folgendes eingeben:
git status
git wird dir sagen, was inszeniert ist usw., einschließlich Anweisungen, wie man die Bühne verlässt:
use "git reset HEAD <file>..." to unstage
Ich finde, git macht einen ziemlich guten Job, indem er mich anstößt, in Situationen wie diesen das Richtige zu tun.
Hinweis: Letzte Git-Versionen (1.8.4.x) haben diese Meldung geändert:
(use "git rm --cached <file>..." to unstage)
Zur Verdeutlichung: git add
verschiebt Änderungen vom aktuellen Arbeitsverzeichnis in den Bereitstellungsbereich (Index).
Dieser Vorgang wird Staging genannt. Der natürlichste Befehl für Bühne die Änderungen (geänderte Dateien) ist also der offensichtliche:
git stage
git add
ist nur ein einfacher zu tippender Alias für git stage
Schade, dass es keine git unstage
oder git unadd
Befehle gibt. Das Relevante ist schwerer zu erraten oder zu merken, aber es 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 benutze ich noch kürzere Aliase:
git a #for staging
git u #for unstaging
Eine Ergänzung zu der akzeptierten Antwort: Wenn Ihre fälschlicherweise hinzugefügte Datei sehr umfangreich ist, werden Sie wahrscheinlich feststellen, dass sie auch nach dem Entfernen aus dem Index mit "git reset
" noch Platz im Verzeichnis ".git
" zu belegen scheint. Dies ist kein Grund zur Sorge, die Datei befindet sich zwar noch im Repository, aber nur als "loses Objekt", sie wird nicht in andere Repositorys kopiert (über Klon, Push) und der Speicherplatz wird schließlich freigegeben vielleicht nicht sehr bald. Wenn Sie ängstlich sind, können Sie laufen:
git gc --Prune=now
Update (was folgt, ist mein Versuch, einige Verwirrung zu beseitigen, die aus den am häufigsten gewählten Antworten entstehen kann):
Also, welches ist das wahre Rückgängigmachen von git add
?
git reset HEAD <file>
?
oder
git rm --cached <file>
?
Genau genommen und wenn ich mich nicht irre: keine .
git add
kann nicht rückgängig gemacht werden - im Allgemeinen sicher.
Erinnern wir uns zunächst, was git add <file>
tatsächlich tut:
Wenn <file>
zuvor nicht verfolgt wurde , fügt git add
ihn mit seinem aktuellen Inhalt dem Cache hinzu.
Wenn <file>
bereits verfolgt wurde , speichert git add
den aktuellen Inhalt (Snapshot, Version) im Cache. In GIT heißt diese Aktion immer noch add , (nicht nur update it), weil zwei verschiedene Versionen (Snapshots) einer Datei werden als zwei verschiedene Elemente betrachtet: Daher fügen wir dem Cache tatsächlich ein neues Element hinzu, das später festgeschrieben werden soll.
Vor diesem Hintergrund ist die Frage etwas mehrdeutig:
Ich habe versehentlich Dateien mit dem Befehl hinzugefügt ...
Das OP-Szenario scheint das erste zu sein (nicht verfolgte Datei). Wir möchten, dass durch "Rückgängig" die Datei (nicht nur der aktuelle Inhalt) aus den verfolgten Elementen entfernt wird. Wenn dies der Fall ist, ist es in Ordnung, git rm --cached <file>
auszuführen.
Und wir könnten auch git reset HEAD <file>
ausführen. Dies ist im Allgemeinen vorzuziehen, da es in beiden Szenarien funktioniert: Es macht auch das Rückgängigmachen, wenn wir eine Version eines bereits verfolgten Elements falsch hinzugefügt haben.
Aber es gibt zwei Vorbehalte.
Erstens: Es gibt (wie in der Antwort ausgeführt) nur ein Szenario, in dem git reset HEAD
nicht funktioniert, git rm --cached
jedoch: ein neues Repository (keine Commits). Aber das ist wirklich ein praktisch irrelevanter Fall.
Zweitens: Beachten Sie, dass git reset HEAD
die zuvor zwischengespeicherten Dateiinhalte nicht auf magische Weise wiederherstellen kann, sondern sie nur erneut vom HEAD synchronisiert. Wenn unser fehlgeleiteter git add
eine zuvor bereitgestellte, nicht festgeschriebene Version überschrieben hat, können wir sie nicht wiederherstellen. Genau genommen können wir [*] deshalb 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
Dies ist natürlich nicht sehr kritisch, wenn wir nur den üblichen langsamen Arbeitsablauf befolgen, bei dem 'git add' nur zum Hinzufügen neuer Dateien ausgeführt wird (Fall 1), und wir aktualisieren neue Inhalte über den Befehl commit, git commit -a
.
* (Bearbeiten: das oben Genannte ist praktisch korrekt, aber es kann immer noch einige leicht verworrene Wege geben, um Änderungen wiederherzustellen, die inszeniert, aber nicht festgeschrieben und dann überschrieben wurden - siehe die Kommentare von Johannes Matokic und iolsmit.)
git rm --cached . -r
wird alles, was Sie aus Ihrem aktuellen Verzeichnis hinzugefügt haben, rekursiv "entfernen"
Rückgängigmachen einer bereits hinzugefügten Datei ist mit git zum Zurücksetzen recht einfach myfile.txt
, das bereits hinzugefügt wurde, verwenden Sie:
git reset HEAD myfile.txt
Erklären Sie:
Nachdem Sie unerwünschte Dateien bereitgestellt haben, können Sie zum Rückgängigmachen git reset
ausführen, Head
ist der Kopf Ihrer Datei in local und der letzte Parameter ist der Name Ihrer Datei.
Ich erstelle die Schritte im Bild unten detaillierter für Sie, einschließlich aller Schritte, die in diesen Fällen auftreten können:
Lauf
git gui
und entfernen Sie alle Dateien manuell oder indem Sie sie alle auswählen und auf die Schaltfläche von Commit entfernen klicken.
Git hat Befehle für jede erdenkliche Handlung, benötigt jedoch umfangreiches Wissen, um die Dinge richtig zu machen, und aus diesem Grund ist es bestenfalls kontraintuitiv ...
Was du vorher getan hast:
git add .
oder git add <file>
verwendet.Was Sie wollen:
Entfernen Sie die Datei aus dem Index, behalten Sie jedoch die Version bei und behalten Sie nicht festgeschriebene Änderungen in der Arbeitskopie bei:
git reset head <file>
Setzen Sie die Datei aus HEAD in den letzten Zustand zurück, indem Sie die Änderungen rückgängig machen und sie aus dem Index entfernen:
# 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 ist erforderlich, da git reset --hard HEAD
nicht mit einzelnen Dateien funktioniert.
Entfernen Sie <file>
aus dem Index und der Versionierung, und behalten Sie die nicht versionierte Datei mit den Änderungen in der Arbeitskopie bei:
git rm --cached <file>
Entfernen Sie <file>
vollständig aus der Arbeitskopie und der Versionsverwaltung:
git rm <file>
Die Frage ist nicht klar gestellt. Der Grund ist, dass _git add
_ zwei Bedeutungen hat:
git rm --cached file
_.git reset HEAD file
_.im Zweifelsfall verwenden Sie
_git reset HEAD file
_
Weil es in beiden Fällen das Erwartete tut.
Warnung: Wenn Sie _git rm --cached file
_ für eine Datei ausführen, die geändert (eine Datei, die zuvor im Repository vorhanden war), wird die Datei am _git commit
_! Es ist weiterhin in Ihrem Dateisystem vorhanden. Wenn jedoch eine andere Person Ihr Commit ausführt, wird die Datei aus ihrem Arbeitsbaum gelöscht.
_git status
_ zeigt an, ob es sich um eine neue Datei oder geändert handelt:
_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
_
Wenn Sie sich bei Ihrem ersten Commit befinden und git reset
nicht verwenden können, melden Sie einfach "Git bankruptcy", löschen Sie den Ordner .git
und beginnen Sie von vorne
Wie bei vielen anderen Antworten können Sie git reset
verwenden.
ABER:
Ich habe diesen tollen kleinen Beitrag gefunden, der tatsächlich den Git-Befehl (also einen Alias) für git unadd
hinzufügt: siehe git unadd für Details oder. .
Einfach,
git config --global alias.unadd "reset HEAD"
Jetzt kannst du
git unadd foo.txt bar.txt
Hierfür kann git remove
oder git rm
mit dem Flag --cached
verwendet werden. Versuchen:
git help rm
Verwenden Sie git add -i
, um gerade hinzugefügte Dateien aus Ihrem bevorstehenden Commit zu entfernen. Beispiel:
Hinzufügen der Datei, die Sie nicht wollten:
$ git add foo
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: foo
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
# [...]#
In das interaktive Hinzufügen gehen, um das Hinzufügen rückgängig zu machen (die hier bei git eingegebenen Befehle sind "r" (Zurücksetzen), "1" (erster Eintrag in der Liste zeigt Zurücksetzen), "Zurück", um den Zurücksetzungsmodus zu verlassen, und "q". (Verlassen):
$ git add -i
staged unstaged path
1: +1/-0 nothing foo
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> r
staged unstaged path
1: +1/-0 nothing [f]oo
Revert>> 1
staged unstaged path
* 1: +1/-0 nothing [f]oo
Revert>>
note: foo is untracked now.
reverted one path
*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now> q
Bye.
$
Das ist es! Hier ist Ihr Beweis, der zeigt, dass "foo" wieder auf der Liste ohne Titel steht:
$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
# [...]
# foo
nothing added to commit but untracked files present (use "git add" to track)
$
So vermeiden Sie dieses störende Problem, wenn Sie ein neues Projekt starten:
git init
aus.Git macht es wirklich schwer, git reset
zu machen, wenn Sie keine Commits haben. Wenn Sie ein kleines initiales Commit erstellen, nur um eines zu haben, können Sie danach so oft git add -A
und git reset
, wie Sie möchten, um alles richtig zu machen.
Ein weiterer Vorteil dieser Methode ist, dass es einfach ist, wenn Sie später auf Probleme mit dem Zeilenende stoßen und alle Ihre Dateien aktualisieren müssen:
Vielleicht hat sich Git weiterentwickelt, seitdem Sie Ihre Frage gestellt haben.
$> git --version
git version 1.6.2.1
Jetzt können Sie versuchen:
git reset HEAD .
Dies sollte das sein, wonach Sie suchen.
Beachten Sie, dass Sie ein Trennzeichen einfügen müssen, wenn Sie keine Revision angeben. Beispiel von meiner Konsole:
git reset <path_to_file>
fatal: ambiguous argument '<path_to_file>': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
git reset -- <path_to_file>
Unstaged changes after reset:
M <path_to_file>
(Git Version 1.7.5.4)
So entfernen Sie neue Dateien aus dem Staging-Bereich (und nur im Falle einer neuen Datei):
git rm --cached FILE
Verwenden Sie rm --cached nur für neue Dateien, die versehentlich hinzugefügt wurden.
Mit dem folgenden Befehl können Sie jede Datei in einem bestimmten Ordner (und dessen Unterordnern) zurücksetzen:
git reset *
verwenden Sie den Befehl *
, um mehrere Dateien gleichzeitig zu verarbeiten
git reset HEAD *.prj
git reset HEAD *.bmp
git reset HEAD *gdb*
usw
Geben Sie einfach git reset
ein, es wird zurückgesetzt, und es ist, als hätten Sie git add .
seit Ihrem letzten Commit nie mehr eingegeben. Stellen Sie sicher, dass Sie sich zuvor verpflichtet haben.
Für eine bestimmte Datei:
- git Reset my_file.txt
- git checkout my_file.txt
Für alle hinzugefügten Dateien:
- git Reset.
- git Checkout.
Hinweis: checkout ändert den Code in den Dateien und wechselt in den zuletzt aktualisierten (festgeschriebenen) Status. reset ändert die Codes nicht; es setzt nur den Header zurück.
Um git rückgängig zu machen, fügen Sie use hinzu
git reset filename
Dieser Befehl entpackt Ihre Änderungen:
git reset HEAD filename.txt
Sie können auch verwenden
git add -p
um Teile von Dateien hinzuzufügen.
Ich bin überrascht, dass niemand den interaktiven Modus erwähnt:
git add -i
wählen Sie Option 3, um das Hinzufügen von Dateien aufzuheben. In meinem Fall möchte ich oft mehr als eine Datei hinzufügen. Im interaktiven Modus können Sie solche Zahlen verwenden, um Dateien hinzuzufügen. Dies wird alles bis auf 4: 1,2,3,5 dauern
Um eine Sequenz auszuwählen, geben Sie einfach 1-5 ein, um alle von 1 bis 5 zu übernehmen.
git add myfile.txt
# Damit wird Ihre Datei in die Liste der festgeschriebenen Dateien aufgenommen
Ganz im Gegenteil zu diesem Befehl ist,
git reset HEAD myfile.txt # this will undo it.
sie befinden sich also im vorherigen Status. Angegeben wird wieder in der nicht verfolgten Liste (vorheriger Zustand).
es wird Ihren Kopf mit der angegebenen Datei zurücksetzen. Wenn Ihr Kopf keine Mittel hat, wird er einfach zurückgesetzt
git reset filename.txt
Entfernt eine Datei mit dem Namen "filename.txt" aus dem aktuellen Index, dem Bereich "begangen werden", ohne etwas anderes zu ändern.
In SourceTree können Sie dies einfach über die GUI tun. Sie können überprüfen, mit welchem Befehlsquellbaum eine Datei dekontrolliert wird.
Ich habe eine neue Datei erstellt und sie zu git hinzugefügt. Dann habe ich es mit der SourceTree-GUI aufgehoben. Das ist das Ergebnis:
Unstaging-Dateien [08/12/15 10:43]
git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q - Pfad/zu/Datei/Dateiname.Java
SourceTree verwendet reset
, um neue Dateien zu entfernen.
git reset filename.txt
Entfernt eine Datei mit dem Namen "filename.txt" aus dem aktuellen Index, dem Bereich "begangen werden", ohne etwas anderes zu ändern.
Eine der intuitivsten Lösungen ist die Verwendung von SourceTree .
Sie können Dateien einfach per Drag-and-Drop aus dem und aus dem Bereitstellungsmodus ziehen
Mit dem Befehl git reset
können Sie entweder den Staging-Bereich oder den Staging-Bereich und den Arbeitsbaum ändern. Gits Fähigkeit, Commits genau nach Ihren Wünschen zu erstellen, bedeutet, dass Sie manchmal Änderungen an den Änderungen rückgängig machen müssen, die Sie mit git add vorgenommen haben.
Sie können dies tun, indem Sie git reset HEAD <file to change>
aufrufen. Sie haben zwei Möglichkeiten, um Änderungen vollständig zu entfernen. git checkout HEAD <file(s) or path(s)>
ist eine schnelle Möglichkeit, Änderungen an Ihrem Staging-Bereich und Ihrem Arbeitsbaum rückgängig zu machen. Gehen Sie mit diesem Befehl jedoch vorsichtig um, da er alle Änderungen an Ihrem Arbeitsbaum entfernt. Git weiß nichts über diese Änderungen, da sie noch nie festgeschrieben wurden. Es gibt keine Möglichkeit, diese Änderungen wiederherzustellen, wenn Sie diesen Befehl ausführen.
Ein weiterer Befehl, der Ihnen zur Verfügung steht, ist git reset --hard
. Es ist für Ihren Arbeitsbaum gleichermaßen zerstörerisch - alle nicht festgeschriebenen oder bereitgestellten Änderungen gehen verloren, nachdem Sie es ausgeführt haben. Das Ausführen von git reset -hard HEAD
bewirkt dasselbe wie git checkout HEAD
. Es ist lediglich keine Datei oder kein Pfad erforderlich, um zu arbeiten.
Sie können --soft
mit git reset
verwenden. Das Repository wird auf das von Ihnen angegebene Commit zurückgesetzt und alle diese Änderungen werden durchgeführt. Alle Änderungen, die Sie bereits vorgenommen haben, sind nicht betroffen, und auch die Änderungen in Ihrem Arbeitsbaum sind nicht betroffen.
Schließlich können Sie mit --mixed
den Arbeitsbaum zurücksetzen, ohne Änderungen vorzunehmen. Hierdurch werden auch alle bereitgestellten Änderungen aufgehoben.