Ich habe Git fälschlicherweise mit dem folgenden Befehl Dateien 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 aufgenommen werden?
git
version-control
git-commit
git-stage
paxos1977
quelle
quelle
HEAD
oderhead
können jetzt@
anstelle vonHEAD
stattdessen verwendet werden. In dieser Antwort (letzter Abschnitt) erfahren Sie, warum Sie das tun können.git checkout
keine abgestuften Änderungen aus dem Festschreibungsindex . Es werden nur nicht bereitgestellte Änderungen auf die letzte festgeschriebene Revision zurückgesetzt - was übrigens auch nicht das ist, was ich will, ich möchte diese Änderungen, ich möchte sie nur in einem späteren Festschreiben.Antworten:
Sie können rückgängig machen,
git add
bevor Sie mit festschreibenDadurch wird es aus dem aktuellen Index (der Liste "In Kürze festgeschrieben") entfernt, ohne dass etwas anderes geändert wird.
Sie können verwenden
ohne Dateinamen, um alle fälligen Änderungen aufzuheben. Dies kann nützlich sein, wenn zu viele Dateien vorhanden sind, um in angemessener Zeit einzeln aufgelistet zu werden.
In alten Versionen von Git, sind die oben genannten Befehle gleichwertig
git reset HEAD <file>
undgit reset HEAD
jeweils und werden scheitern , wennHEAD
nicht definiert ist (weil Sie haben noch keine Commits in Ihrem Repository gemacht) oder mehrdeutig (weil Sie einen Zweig namens geschaffenHEAD
, die eine dumme Sache ist das solltest du nicht tun). Dies wurde jedoch in Git 1.8.2 geändert , sodass Sie in modernen Versionen von Git die obigen Befehle bereits vor dem ersten Festschreiben verwenden können:quelle
git add
eine zuvor bereitgestellte, nicht festgeschriebene Version überschrieben hat, können wir sie nicht wiederherstellen. Ich habe versucht, dies in meiner Antwort unten zu klären.git reset HEAD *.ext
Woext
sind die Dateien der angegebenen Erweiterung, die Sie entfernen möchten? Für mich war es*.bmp
&*.zip
git rm --cached
, bedeutet dies, dass Sie sich auf ein Commit vorbereiten, das diese Datei löscht .git reset HEAD <filename>
Auf der anderen Seite wird die Datei von HEAD in den Index kopiert, sodass beim nächsten Commit keine Änderungen an dieser Datei angezeigt werden.git reset -p
Just Like gibtgit add -p
. Das ist fantastisch!git add
Wiederherstellung erstellt wurden (61/3AF3...
- > Objekt-ID613AF3...
), danngit cat-file -p <object-id>
(könnte es sich lohnen, mehrere Stunden Arbeit wiederherzustellen, aber auch eine Lektion, um öfter zu verpflichten ...)Sie wollen:
Argumentation:
Als ich neu darin war, habe ich es zuerst versucht
(um mein gesamtes anfängliches Hinzufügen rückgängig zu machen), nur um diese (nicht so) hilfreiche Nachricht zu erhalten:
Es stellt sich heraus, dass dies daran liegt, dass der HEAD-Verweis (Zweig?) Erst nach dem ersten Festschreiben vorhanden ist. Das heißt, Sie werden auf dasselbe Anfängerproblem stoßen wie ich, wenn Ihr Workflow wie meiner so etwas wie:
git init
git add .
git status
... viele Mistrollen von ...
=> Verdammt, ich wollte das alles nicht hinzufügen.
google "git add rückgängig machen"
=> Stapelüberlauf finden - yay
git reset .
=> fatal: Fehler beim Auflösen von 'HEAD' als gültige Referenz.
Es stellt sich ferner heraus, dass in der Mailingliste ein Fehler protokolliert wurde, der gegen die Nicht-Hilfbarkeit dieses Fehlers protokolliert wurde .
Und dass die richtige Lösung genau dort in der Git-Statusausgabe war (was ich ja als 'Mist' beschönigt habe)
Und die Lösung ist in der Tat zu verwenden
git rm --cached FILE
.Beachten Sie die Warnungen an anderer Stelle hier -
git rm
löscht Ihre lokale Arbeitskopie der Datei, jedoch nicht, wenn Sie --cached verwenden . Hier ist das Ergebnis vongit help rm
:Ich fahre fort zu benutzen
alles entfernen und neu starten. Hat aber nicht funktioniert, denn während
add .
es rekursiv ist, stellt sich heraus , dass es rekursiv seinrm
muss-r
. Seufzer.Okay, jetzt bin ich wieder da, wo ich angefangen habe. Das nächste Mal werde ich
-n
einen Probelauf machen und sehen, was hinzugefügt wird:Ich gezippt alles an einen sicheren Ort, bevor im Vertrauen
git help rm
über die--cached
nicht zu zerstören alles (und was ist, wenn ich es falsch geschrieben).quelle
rm -rf .git
,git init
weil ich nicht darauf vertrautegit rm --cached
, meine Arbeitskopie zu behalten. Es sagt ein wenig aus, wie git an manchen Stellen immer noch zu komplex ist.git unstage
Sollte es sich nur um einen Standardbefehl handeln, ist es mir egal, ob ich ihn als Alias hinzufügen kann.git reset HEAD <File>...
git add
Befehl neue Dateien hinzugefügt hat, jedoch keine Änderungen an vorhandenen Dateien vorgenommen hat.Wenn Sie Folgendes eingeben:
Git wird Ihnen sagen, was inszeniert wird usw., einschließlich Anweisungen zum Aufheben der Bühne:
Ich finde, Git macht einen ziemlich guten Job und stupst mich an, in solchen Situationen das Richtige zu tun.
Hinweis: Neuere Git-Versionen (1.8.4.x) haben diese Meldung geändert:
quelle
add
ed-Datei bereits verfolgt wurde (dieadd
einzige, die eine neue Version im Cache gespeichert hat - hier wird Ihre Nachricht angezeigt). Wenn die Datei zuvor nichtuse "git rm --cached <file>..." to unstage
git reset HEAD <file>
eine ist der einzige, der funktioniert, wenn Sie eine Datei löschengit reset HEAD
, die Bühne zu verlassen.Zur Verdeutlichung:
git add
Verschiebt Änderungen aus dem aktuellen Arbeitsverzeichnis in den Staging-Bereich (Index).Dieser Vorgang wird als Staging bezeichnet . Der natürlichste Befehl zum Bereitstellen der Änderungen (geänderte Dateien) ist also der offensichtliche:
git add
ist nur ein einfacher zu tippender Alias fürgit stage
Schade , es gibt keine
git unstage
nochgit unadd
Befehle. Das relevante ist schwerer zu erraten oder zu merken, aber es ist ziemlich offensichtlich:Wir können dafür leicht einen Alias erstellen:
Und schließlich haben wir neue Befehle:
Persönlich verwende ich noch kürzere Aliase:
quelle
git stage
ist der Alias fürgit add
, der der historische Befehl ist, sowohl auf Git als auch auf anderen SCM. Es wurde im Dezember 2008 mit Commit 11920d28da im "Git's Git Repository" hinzugefügt, wenn ich sagen kann.Eine Ergänzung zur akzeptierten Antwort: Wenn Ihre versehentlich hinzugefügte Datei sehr groß war, werden Sie wahrscheinlich feststellen, dass sie auch nach dem Entfernen aus dem Index mit '
git reset
' immer noch Speicherplatz im.git
Verzeichnis belegt.Dies ist kein Grund zur Sorge; Die Datei befindet sich zwar noch im Repository, aber nur als "loses Objekt". Es wird nicht in andere Repositorys kopiert (per Klon, Push), und der Speicherplatz wird schließlich zurückgefordert - wenn auch möglicherweise nicht sehr bald. Wenn Sie Angst haben, können Sie laufen:
Update (was folgt, ist mein Versuch, einige Verwirrungen zu beseitigen, die sich aus den am besten bewerteten Antworten ergeben können):
Also, was 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 - sicher im Allgemeinen.Erinnern wir uns zuerst daran, was
git add <file>
tatsächlich tut:Wenn
<file>
wurde bisher nicht verfolgt ,git add
fügt sie den Cache , mit seinem aktuellen Inhalt.Wenn
<file>
wurde bereits verfolgt ,git add
speichert den aktuellen Inhalt (Snapshot, Version) in den Cache. In Git wird diese Aktion immer noch als Hinzufügen bezeichnet (nicht nur als Aktualisierung ), da zwei verschiedene Versionen (Snapshots) einer Datei als zwei verschiedene Elemente betrachtet werden. Daher fügen wir dem Cache tatsächlich ein neues Element hinzu, um schließlich zu sein später begangen.Vor diesem Hintergrund ist die Frage etwas mehrdeutig:
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 zu laufen
git rm --cached <file>
.Und wir könnten auch rennen
git reset HEAD <file>
. Dies ist im Allgemeinen vorzuziehen, da es in beiden Szenarien funktioniert: Es wird auch rückgängig gemacht, wenn wir fälschlicherweise eine Version eines bereits verfolgten Elements hinzugefügt haben.Es gibt jedoch zwei Einschränkungen.
Erstens: Es gibt (wie in der Antwort ausgeführt) nur ein Szenario, in dem
git reset HEAD
dies nicht funktioniert, abergit rm --cached
funktioniert: ein neues Repository (keine Commits). Aber das ist wirklich ein praktisch irrelevanter Fall.Zweitens: Beachten Sie, dass
git reset HEAD
der zuvor zwischengespeicherte Dateiinhalt nicht auf magische Weise wiederhergestellt werden kann, sondern nur vom HEAD neu synchronisiert wird. Wenn unsergit add
Irrtum eine zuvor bereitgestellte, nicht festgeschriebene Version überschrieben hat, können wir sie nicht wiederherstellen. Genau deshalb können wir [*] nicht rückgängig machen.Beispiel:
Dies ist natürlich nicht sehr kritisch, wenn wir nur dem üblichen verzögerten Workflow folgen, bei dem 'git add' nur zum Hinzufügen neuer Dateien ausgeführt wird (Fall 1), und neue Inhalte über den
git commit -a
Befehl commit, aktualisieren .* (Bearbeiten: Das oben Gesagte ist praktisch korrekt, aber es kann dennoch einige leicht hackige / verschlungene Möglichkeiten geben, Änderungen wiederherzustellen, die inszeniert, aber nicht festgeschrieben und dann überschrieben wurden - siehe die Kommentare von Johannes Matokic und iolsmit).
quelle
git cat-file
kann sie verwendet werden, um ihren Inhalt wiederherzustellen.git add
besteht daringit fsck --unreachable
, alle nicht erreichbaren Objekte aufzulisten, die Sie dann überprüfen können,git show SHA-1_ID
odergit fsck --lost-found
die je nach Typ baumelnde Objekte in.git/lost-found/commit/
oder schreiben.git/lost-found/other/
. Siehe auchgit fsck --help
Das Rückgängigmachen einer bereits hinzugefügten Datei ist mit Git ganz einfach.
myfile.txt
Verwenden Sie zum Zurücksetzen , die bereits hinzugefügt wurden, Folgendes:Erläuterung:
Nachdem Sie unerwünschte Dateien bereitgestellt haben, können Sie dies rückgängig machen
git reset
.Head
ist der Kopf Ihrer Datei im lokalen und der letzte Parameter ist der Name Ihrer Datei.Ich habe die Schritte im Bild unten detaillierter für Sie erstellt, einschließlich aller Schritte, die in diesen Fällen auftreten können:
quelle
wird alles, was Sie aus Ihrem aktuellen Verzeichnis hinzugefügt haben, rekursiv "entfernen"
quelle
git reset HEAD <file>
würde ich sagenfatal: Failed to resolve 'HEAD' as a valid ref.
Lauf
und entfernen Sie alle Dateien manuell oder indem Sie alle auswählen und auf die Schaltfläche "Unstage from Commit" klicken .
quelle
git-gui
..."Git hat Befehle für jede erdenkliche Aktion, aber es benötigt umfangreiches Wissen, um die Dinge richtig zu machen, und aus diesem Grund ist es bestenfalls kontraintuitiv ...
Was du vorher gemacht hast:
git add .
, odergit add <file>
.Was du willst:
Entfernen Sie die Datei aus dem Index, aber lassen Sie sie versioniert und lassen Sie nicht festgeschriebene Änderungen in der Arbeitskopie:
Setzen Sie die Datei von HEAD auf den letzten Status zurück, machen Sie Änderungen rückgängig und entfernen Sie sie aus dem Index:
Dies ist erforderlich, da
git reset --hard HEAD
es nicht mit einzelnen Dateien funktioniert.<file>
Aus dem Index und der Versionierung entfernen und die nicht versionierte Datei mit Änderungen in der Arbeitskopie beibehalten:<file>
Aus der Arbeitskopie entfernen und vollständig versionieren:quelle
reset head
macht Ihre aktuellen Änderungen rückgängig, aber die Datei wird immer noch von git überwacht.rm --cached
Entfernt die Versionierung der Datei, sodass git sie nicht mehr auf Änderungen überprüft (und eventuell indizierte aktuelle Änderungen entfernt, die git vom vorherigen Benutzer mitgeteilt wurdenadd
). Die geänderte Datei wird jedoch in Ihrer Arbeitskopie, dh in Ihrem Dateiordner, gespeichert auf der Festplatte.git reset HEAD <file>
nur vorübergehend - der Befehl wird nur auf das nächste Commit angewendet, wird jedochgit rm --cached <file>
deaktiviert, bis er erneut hinzugefügt wirdgit add <file>
. Auchgit rm --cached <file>
Mittel , wenn Sie diesen Zweig an den Remote drücken, kann jeder den Zweig zieht die Datei tatsächlich gelöscht aus ihrem Ordner erhalten.Die Frage ist nicht klar gestellt. Der Grund ist, dass dies
git add
zwei Bedeutungen hat:git rm --cached file
.git reset HEAD file
.Im Zweifelsfall verwenden
Weil es in beiden Fällen das Erwartete tut.
Warnung: Wenn Sie
git rm --cached file
eine Datei bearbeiten, die geändert wurde (eine Datei, die zuvor im Repository vorhanden war), wird die Datei am entferntgit commit
! Es ist weiterhin in Ihrem Dateisystem vorhanden, aber wenn jemand anderes Ihr Commit abruft, wird die Datei aus seinem Arbeitsbaum gelöscht.git status
wird Ihnen sagen, ob die Datei eine neue Datei war oder geändert wurde :quelle
git rm --cached somefile
. Ich hoffe, diese Antwort erreicht die Seite an einer prominenten Stelle, wo sie Neulinge davor schützen kann, durch all die falschen Behauptungen in die Irre geführt zu werden.Wenn Sie sich in Ihrem ersten Commit befinden und es nicht verwenden können
git reset
, melden Sie einfach "Git bankrott" und löschen Sie den.git
Ordner und beginnen Sie von vornequelle
git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit'
Failed to resolve 'HEAD'
Wie bei vielen anderen Antworten können Sie verwenden
git reset
ABER:
Ich habe diesen tollen kleinen Beitrag gefunden, der tatsächlich den Git-Befehl ( naja , einen Alias) hinzufügt für
git unadd
: siehe git unadd für Details oder ..Einfach,
Jetzt kannst du
quelle
Verwenden Sie
git add -i
diese Option , um gerade hinzugefügte Dateien aus Ihrem bevorstehenden Commit zu entfernen. Beispiel:Hinzufügen der Datei, die Sie nicht wollten:
Gehen Sie zum interaktiven Hinzufügen, um Ihr Hinzufügen rückgängig zu machen (die hier bei git eingegebenen Befehle sind "r" (Zurücksetzen), "1" (erster Eintrag in der Liste "Zurücksetzen zeigt"), "Zurück", um den Wiederherstellungsmodus zu verlassen, und "q". (Verlassen):
Das ist es! Hier ist Ihr Beweis, der zeigt, dass "foo" wieder auf der nicht verfolgten Liste steht:
quelle
git remove
odergit rm
kann dafür mit der--cached
Flagge verwendet werden. Versuchen:quelle
git rm --cached ...
entfernt Dateien aus einem Git-Repo. Sie sind weiterhin auf Ihrem Computer vorhanden, dies unterscheidet sich jedoch SEHR davon, Änderungen an einer Datei aufzuheben . Für jeden, der darüber stolpert, ist es keine gültige Antwort auf die Frage.So vermeiden Sie dieses ärgerliche Problem, wenn Sie ein neues Projekt starten:
git init
.Git macht es wirklich schwierig,
git reset
wenn Sie keine Commits haben. Wenn Sie ein winziges anfängliches Commit erstellen, nur um eines zu haben, können Sie danachgit add -A
undgit reset
so oft Sie möchten, um alles richtig zu machen.Ein weiterer Vorteil dieser Methode besteht darin, dass es einfach ist, wenn Sie später auf Probleme mit dem Zeilenende stoßen und alle Ihre Dateien aktualisieren müssen:
quelle
autocrlf
Wert ab ... Dies funktioniert je nach den Einstellungen nicht in jedem Projekt.git reset somefile
undgit reset
beide arbeiten jetzt vor dem ersten Commit. Dies ist seit mehreren Git-Veröffentlichungen der Fall.Vielleicht hat sich Git weiterentwickelt, seit Sie Ihre Frage gestellt haben.
Jetzt können Sie versuchen:
Dies sollte das sein, wonach Sie suchen.
quelle
Beachten Sie, dass Sie ein Trennzeichen einfügen müssen, wenn Sie keine Revision angeben. Beispiel von meiner Konsole:
(Git Version 1.7.5.4)
quelle
git reset <path>
und es funktioniert gut ohne Trennzeichen. Ich benutze auch Git 1.9.0. Vielleicht funktioniert es in älteren Versionen nicht?So entfernen Sie neue Dateien aus dem Staging-Bereich (und nur im Falle einer neuen Datei), wie oben vorgeschlagen:
Verwenden Sie rm --cached nur für neue Dateien, die versehentlich hinzugefügt wurden.
quelle
--cached
hier ein wirklich wichtiger Teil ist.Mit dem folgenden Befehl können Sie jede Datei in einem bestimmten Ordner (und seinen Unterordnern) zurücksetzen:
quelle
git status
, um alles zu sehen, was noch übrig ist, und es manuell zurücksetzen, dhgit reset file
.Verwenden Sie den
*
Befehl, um mehrere Dateien gleichzeitig zu verarbeiten:usw.
quelle
.*
oder.*.prj
Geben
git reset
Sie einfach ein, es wird zurückgesetzt und es ist, als hätten Siegit add .
seit Ihrem letzten Commit nie mehr getippt . Stellen Sie sicher, dass Sie sich zuvor verpflichtet haben.quelle
Angenommen, ich erstelle eine neue Datei
newFile.txt
:Angenommen, ich füge die Datei versehentlich hinzu
git add newFile.txt
:Jetzt möchte ich dieses Hinzufügen vor dem Festschreiben rückgängig machen
git reset newFile.txt
:quelle
Für eine bestimmte Datei:
Für alle hinzugefügten Dateien:
Hinweis: Beim Auschecken wird der Code in den Dateien geändert und in den zuletzt aktualisierten (festgeschriebenen) Status versetzt. Durch das Zurücksetzen werden die Codes nicht geändert. es setzt nur den Header zurück.
quelle
git reset <file>
undgit checkout <file>
.Mit diesem Befehl werden Ihre Änderungen aufgehoben:
Sie können auch verwenden
Teile von Dateien hinzufügen.
quelle
Es gibt auch einen interaktiven Modus:
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, und im interaktiven Modus können Sie Zahlen wie diese verwenden, um Dateien hinzuzufügen. Dies dauert bis auf 4: 1, 2, 3 und 5
Um eine Sequenz auszuwählen, geben Sie einfach 1-5 ein, um alle von 1 bis 5 zu übernehmen.
Git-Staging-Dateien
quelle
git add
Verwenden Sie zum Rückgängigmachen :quelle
Entfernt eine Datei mit dem Namen filename.txt aus dem aktuellen Index, dem Bereich "kurz vor dem Festschreiben", ohne dass etwas anderes geändert wird.
quelle
git add myfile.txt
# Dadurch wird Ihre Datei in die Liste der festzuschreibenden Dateien aufgenommenGanz im Gegenteil zu diesem Befehl ist,
Sie befinden sich also im vorherigen Status. Angegeben wird wieder in der nicht verfolgten Liste (vorheriger Status).
Es wird Ihren Kopf mit der angegebenen Datei zurücksetzen. Wenn Ihr Kopf keine Mittel hat, wird er einfach zurückgesetzt.
quelle
In Sourcetree können Sie dies einfach über die GUI tun. Sie können überprüfen, mit welchem Befehl Sourcetree eine Datei entsorgt.
Ich habe eine neue Datei erstellt und sie zu Git hinzugefügt. Dann habe ich es über die Sourcetree-Benutzeroberfläche freigegeben. Das ist das Ergebnis:
Sourcetree wird verwendet
reset
, um neue Dateien zu entfernen.quelle
quelle