Wie mache ich "git add" vor dem Festschreiben rückgängig?

8962

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?

paxos1977
quelle
22
Ab Git v1.8.4 werden alle Antworten unten verwendet HEADoder headkönnen jetzt @anstelle von HEADstattdessen verwendet werden. In dieser Antwort (letzter Abschnitt) erfahren Sie, warum Sie das tun können.
3
Ich habe ein wenig sommerlich gemacht, das alle Möglichkeiten zeigt, eine Datei zu entfernen: stackoverflow.com/questions/6919121/…
Daniel Alder
5
Warum nicht git checkout?
Erik Reppen
13
@ErikReppen entfernt git checkoutkeine 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.
paxos1977
4
Wenn Sie Eclipse verwenden, ist es so einfach wie das Deaktivieren der Dateien im Dialogfeld "
Festschreiben

Antworten:

10368

Sie können rückgängig machen, git addbevor Sie mit festschreiben

git reset <file>

Dadurch wird es aus dem aktuellen Index (der Liste "In Kürze festgeschrieben") entfernt, ohne dass etwas anderes geändert wird.

Sie können verwenden

git reset

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>und git reset HEADjeweils und werden scheitern , wenn HEADnicht definiert ist (weil Sie haben noch keine Commits in Ihrem Repository gemacht) oder mehrdeutig (weil Sie einen Zweig namens geschaffen HEAD, 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:

"git reset" (ohne Optionen oder Parameter) wird verwendet, um Fehler zu verursachen, 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 sind).

Genehack
quelle
92
Dies ist natürlich kein echtes Rückgängigmachen, denn wenn das Falsche git addeine zuvor bereitgestellte, nicht festgeschriebene Version überschrieben hat, können wir sie nicht wiederherstellen. Ich habe versucht, dies in meiner Antwort unten zu klären.
Leonbloy
7
git reset HEAD *.extWo extsind die Dateien der angegebenen Erweiterung, die Sie entfernen möchten? Für mich war es *.bmp&*.zip
boulder_ruby
18
@Jonny, der Index (auch bekannt als Staging-Bereich) enthält alle Dateien, nicht nur geänderte Dateien. Es "startet das Leben" (wenn Sie ein Commit auschecken oder ein Repo klonen) als Kopie aller Dateien im Commit, auf die HEAD verweist. Wenn Sie also eine Datei aus dem index ( ) entfernengit 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.
Wildcard
11
Ich habe gerade entdeckt, dass es ein git reset -pJust Like gibt git add -p. Das ist fantastisch!
Donquijote
10
Sie können tatsächlich überschriebene, zuvor bereitgestellte, aber nicht festgeschriebene Änderungen wiederherstellen, jedoch nicht benutzerfreundlich und nicht 100% sicher (zumindest keine, die ich gefunden habe): gehe zu .git / Objekte, suche nach Dateien, die zum Zeitpunkt der git addWiederherstellung erstellt wurden ( 61/3AF3...- > Objekt-ID 613AF3...), dann git cat-file -p <object-id>(könnte es sich lohnen, mehrere Stunden Arbeit wiederherzustellen, aber auch eine Lektion, um öfter zu verpflichten ...)
Peter Schneider
2151

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-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:

  1. CD in mein tolles neues Projektverzeichnis, um Git, die neue Hotness, auszuprobieren
  2. git init
  3. git add .
  4. git status

    ... viele Mistrollen von ...

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

  5. google "git add rückgängig machen"

    => Stapelüberlauf finden - yay

  6. 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)

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

Und die Lösung ist in der Tat zu verwenden git rm --cached FILE.

Beachten Sie die Warnungen an anderer Stelle hier - git rmlöscht Ihre lokale Arbeitskopie der Datei, jedoch nicht, wenn Sie --cached verwenden . Hier ist das Ergebnis von git help rm:

--cached Verwenden Sie diese Option, um Pfade zu entfernen und nur aus dem Index zu entfernen. Arbeitsbaumdateien, ob geändert oder nicht, bleiben erhalten.

Ich fahre fort zu benutzen

git rm --cached .

alles entfernen und neu starten. Hat aber nicht funktioniert, denn während add .es rekursiv ist, stellt sich heraus , dass es rekursiv sein rmmuss -r. Seufzer.

git rm -r --cached .

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

git add -n .

Ich gezippt alles an einen sicheren Ort, bevor im Vertrauen git help rmüber die --cachednicht zu zerstören alles (und was ist, wenn ich es falsch geschrieben).

Rhabarber
quelle
15
Hah. Ich folgte dem gleichen Prozess. Außer ich gab auf und sagte rm -rf .git, git initweil ich nicht darauf vertraute git rm --cached, meine Arbeitskopie zu behalten. Es sagt ein wenig aus, wie git an manchen Stellen immer noch zu komplex ist. git unstageSollte es sich nur um einen Standardbefehl handeln, ist es mir egal, ob ich ihn als Alias ​​hinzufügen kann.
Adrian Macneil
5
Für mich sagt gitgit reset HEAD <File>...
drahnr
16
git rm --cached <Datei> ist eigentlich die richtige Antwort, wenn es sich um den ersten Import von <Datei> in das Repository handelt. Wenn Sie versuchen, eine Änderung an der Datei aufzuheben, ist Git Reset die richtige Antwort. Leute, die sagen, dass diese Antwort falsch ist, denken an eine andere Frage.
Barry Kelly
14
Dies funktioniert tatsächlich, jedoch nur beim ersten Festschreiben, bei dem die Datei zuvor nicht vorhanden war oder bei dem der git addBefehl neue Dateien hinzugefügt hat, jedoch keine Änderungen an vorhandenen Dateien vorgenommen hat.
naught101
4
nur um zu zeigen, wie unintuitiv und verschlungen git ist. Anstatt parallele "Rückgängig" -Befehle zu haben, müssen Sie herausfinden, wie Sie sie rückgängig machen können. Als würden Sie versuchen, Ihr Bein in schnellem Sand zu befreien und dann Ihren Arm stecken zu lassen, dann Ihren anderen Arm stecken zu lassen ... Jeder Befehl sollte über die GUI ausgeführt werden, mit Dropdown-Menüpunkten für die Optionen ... Denken Sie an die gesamte Benutzeroberfläche. Produktivitätssteigerungen, die wir hatten, aber wir haben das Durcheinander einer Retro-Befehlszeilenschnittstelle. Es ist nicht so, dass die Git-GUI-Programme dies intuitiver machen.
Ahnbizcad
532

Wenn Sie Folgendes eingeben:

git status

Git wird Ihnen sagen, was inszeniert wird usw., einschließlich Anweisungen zum Aufheben der Bühne:

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

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:

(use "git rm --cached <file>..." to unstage)
Paul Beckingham
quelle
19
Die Nachricht ist unterschiedlich, je nachdem, ob die added-Datei bereits verfolgt wurde (die addeinzige, die eine neue Version im Cache gespeichert hat - hier wird Ihre Nachricht angezeigt). Wenn die Datei zuvor nicht use "git rm --cached <file>..." to unstage
bereitgestellt wurde
Großartig! Der git reset HEAD <file>eine ist der einzige, der funktioniert, wenn Sie eine Datei löschen
möchten
2
Meine Git-Version 2.14.3 sagt git reset HEAD, die Bühne zu verlassen.
SilverWolf - Stellen Sie Monica am
246

Zur Verdeutlichung: git addVerschiebt Ä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 stage

git add ist nur ein einfacher zu tippender Alias ​​für git stage

Schade , es gibt keine git unstagenoch git unaddBefehle. 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 verwende ich noch kürzere Aliase:

git a # For staging
git u # For unstaging
Takeshin
quelle
3
"bewegt sich"? Dies würde anzeigen, dass es aus dem Arbeitsverzeichnis entfernt wurde. Das ist nicht der Fall.
Thomas Weller
4
Warum ist es offensichtlich?
Lenar Hoyt
Tatsächlich git stageist der Alias ​​für git 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.
Obsidian
1
Dies mag nichts damit zu tun haben, aber ich habe festgestellt, dass die Validierung der Datei vor dem Hinzufügen eine nützliche Idee ist. So etwas wie Dateiname mit Prüfbefehl && git Dateiname hinzufügen, habe ich git auf meinem Computer durch ein kürzeres g ersetzt, und bisher hat es funktioniert ok für mich: github.com/dataf3l/g , ich weiß nicht, ob dies für jemanden nützlich sein wird, aber ich werde es hier in der Hoffnung platzieren, dass es einigen Leuten Zeit spart.
Felipe Valdes
167

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 .gitVerzeichnis 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:

git gc --prune=now

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:

  1. Wenn <file>wurde bisher nicht verfolgt , git add fügt sie den Cache , mit seinem aktuellen Inhalt.

  2. 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:

Ich habe fälschlicherweise 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 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 HEADdies nicht funktioniert, aber git rm --cachedfunktioniert: 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 unser git addIrrtum 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:

$ 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

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 -aBefehl 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).

leonbloy
quelle
4
Genau genommen gibt es eine Möglichkeit, eine bereits bereitgestellte Datei wiederherzustellen, die durch git add ersetzt wurde. Wie Sie bereits erwähnt haben, erstellt git add ein git-Objekt für diese Datei, das nicht nur beim vollständigen Entfernen der Datei, sondern auch beim Überschreiben mit neuem Inhalt zu einem losen Objekt wird. Es gibt jedoch keinen Befehl, um es automatisch wiederherzustellen. Stattdessen muss die Datei manuell oder mit Tools identifiziert und extrahiert werden, die nur für diesen Fall geschrieben wurden (libgit2 erlaubt dies). Dies zahlt sich jedoch nur aus, wenn die Datei sehr wichtig und groß ist und durch Bearbeiten der vorherigen Version nicht neu erstellt werden konnte.
Johannes Matokic
2
Um mich selbst zu korrigieren: Sobald die lose Objektdatei gefunden wurde (Metadaten wie Erstellungsdatum / -zeit verwenden), git cat-filekann sie verwendet werden, um ihren Inhalt wiederherzustellen.
Johannes Matokic
2
Eine andere Möglichkeit, Änderungen wiederherzustellen, die bereitgestellt, aber nicht festgeschrieben und dann von z. B. einer anderen überschrieben wurden, git addbesteht darin git fsck --unreachable, alle nicht erreichbaren Objekte aufzulisten, die Sie dann überprüfen können, git show SHA-1_IDoder git fsck --lost-founddie je nach Typ baumelnde Objekte in .git/lost-found/commit/oder schreiben .git/lost-found/other/. Siehe auchgit fsck --help
Iolsmit
110

Das Rückgängigmachen einer bereits hinzugefügten Datei ist mit Git ganz einfach. myfile.txtVerwenden Sie zum Zurücksetzen , die bereits hinzugefügt wurden, Folgendes:

git reset HEAD myfile.txt

Erläuterung:

Nachdem Sie unerwünschte Dateien bereitgestellt haben, können Sie dies rückgängig machen git reset. Headist 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:

git HEAD-Datei zurücksetzen

Alireza
quelle
Bild: "Der Befehl hinzufügen ...""Der Befehl fügt hinzu ..." ( Präsens, dritte Person )
Peter Mortensen
Bild: wollenwollen (hier muss kein Slang verwendet werden)
Peter Mortensen
92
git rm --cached . -r

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

Braitsch
quelle
3
Ich wollte nicht alles entfernen, nur EINE bestimmte Datei.
paxos1977
3
Auch hilfreich, wenn Sie noch keine Commits haben. In Ermangelung eines vorherigen Commits git reset HEAD <file>würde ich sagenfatal: Failed to resolve 'HEAD' as a valid ref.
Priya Ranjan Singh
6
Nein, dies fügt eine Löschung von allem in Ihrem aktuellen Verzeichnis hinzu. Ganz anders als nur Änderungen aufzuheben.
Mark Amery
88

Lauf

git gui

und entfernen Sie alle Dateien manuell oder indem Sie alle auswählen und auf die Schaltfläche "Unstage from Commit" klicken .

Khaja Minhajuddin
quelle
1
Ja ich verstehe das. Ich wollte nur implizit vorschlagen, dass Sie dies in Ihrer Antwort wie "Sie können verwenden git-gui..."
angeben
1
Es heißt "git-gui: Befehl nicht gefunden". Ich bin mir nicht sicher, ob das funktioniert.
Parinda Rajapaksha
Wow, das ist viel einfacher als Befehlszeilen zu machen, die du nicht verstanden hast. Dies ist definitiv für einen Anfänger wie mich zu empfehlen. Danke, dass du das geschrieben hast!
Irfandy Jip
Vielen Dank. Wollte es nicht riskieren, musste also die GUI verwenden.
Sagar Khatri
83

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:

  • Eine Datei geändert und verwendet git add ., oder git 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:

    git reset head <file>
    
  • 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:

    # 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 HEADes nicht mit einzelnen Dateien funktioniert.

  • <file>Aus dem Index und der Versionierung entfernen und die nicht versionierte Datei mit Änderungen in der Arbeitskopie beibehalten:

    git rm --cached <file>
    
  • <file>Aus der Arbeitskopie entfernen und vollständig versionieren:

    git rm <file>
    
sjas
quelle
1
Ich kann den Unterschied zwischen 'git reset head <Datei>' und 'git rm --cached <Datei> nicht verstehen. Könnten Sie es erklären?
Jeswang
6
@ jeswang-Dateien sind entweder "bekannt" (Änderungen an ihnen werden nachverfolgt.) oder sie sind nicht "versioniert". reset headmacht Ihre aktuellen Änderungen rückgängig, aber die Datei wird immer noch von git überwacht. rm --cachedEntfernt 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 wurden add). Die geänderte Datei wird jedoch in Ihrer Arbeitskopie, dh in Ihrem Dateiordner, gespeichert auf der Festplatte.
Sjas
3
Der Unterschied ist git reset HEAD <file>nur vorübergehend - der Befehl wird nur auf das nächste Commit angewendet, wird jedoch git rm --cached <file>deaktiviert, bis er erneut hinzugefügt wird git add <file>. Auch git 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.
DrewT
80

Die Frage ist nicht klar gestellt. Der Grund ist, dass dies git addzwei Bedeutungen hat:

  1. Hinzufügen einer neuen Datei zum Staging-Bereich, dann rückgängig machen mit git rm --cached file.
  2. Hinzufügen einer geänderten Datei zum Staging-Bereich, dann rückgängig machen mit git reset HEAD file.

Im Zweifelsfall verwenden

git reset HEAD file

Weil es in beiden Fällen das Erwartete tut.

Warnung: Wenn Sie git rm --cached fileeine Datei bearbeiten, die geändert wurde (eine Datei, die zuvor im Repository vorhanden war), wird die Datei am entfernt git commit! Es ist weiterhin in Ihrem Dateisystem vorhanden, aber wenn jemand anderes Ihr Commit abruft, wird die Datei aus seinem Arbeitsbaum gelöscht.

git statuswird Ihnen sagen, ob die Datei eine neue Datei war oder geändert wurde :

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
Michael_Scharf
quelle
7
+1. Eine außerordentlich große Anzahl von hoch bewerteten Antworten und Kommentaren auf dieser Seite ist einfach falsch in Bezug auf das Verhalten von 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.
Mark Amery
eine der besten Antworten hier, leider ist es ziemlich niedrig auf der Liste
Creos
64

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 .gitOrdner und beginnen Sie von vorne

Ana Betts
quelle
5
Ein Tipp ist, Ihre .git / config-Datei zu kopieren, wenn Sie einen Remote-Ursprung hinzugefügt haben, bevor Sie den Ordner löschen.
Tiago
4
@ ChrisJohnsen Kommentar ist genau richtig. Manchmal möchten Sie alle Dateien außer einer git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit'Failed to resolve 'HEAD'
57

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,

git config --global alias.unadd "reset HEAD"

Jetzt kannst du

git unadd foo.txt bar.txt
Electblake
quelle
45

Verwenden Sie git add -idiese Option , 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)
# [...]#

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):

$ 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 nicht verfolgten Liste 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)
$
Alex North-Keys
quelle
42

git removeoder git rmkann dafür mit der --cachedFlagge verwendet werden. Versuchen:

git help rm
Gnud
quelle
9
Wird die Datei dadurch nicht vollständig entfernt?
Willa
8
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.
Addison
38

So vermeiden Sie dieses ärgerliche Problem, wenn Sie ein neues Projekt starten:

  • Erstellen Sie das Hauptverzeichnis für Ihr neues Projekt.
  • Ausführen git init.
  • Erstellen Sie nun eine Gitignore-Datei (auch wenn diese leer ist).
  • Übernehmen Sie Ihre .gitignore-Datei.

Git macht es wirklich schwierig, git resetwenn Sie keine Commits haben. Wenn Sie ein winziges anfängliches Commit erstellen, nur um eines zu haben, können Sie danach git add -Aund git resetso 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:

  • Überprüfen Sie das anfängliche Commit. Dadurch werden alle Ihre Dateien entfernt.
  • Überprüfen Sie dann erneut Ihr letztes Commit. Dadurch werden neue Kopien Ihrer Dateien unter Verwendung Ihrer aktuellen Einstellungen für das Zeilenende abgerufen.
Ryan Lundy
quelle
1
Bestätigt! Versuchte einen Git-Reset nach einem Git-Add. und git beschwerte sich über korrupten KOPF. Nach Ihrem Rat konnte ich ohne Probleme hin und her hinzufügen und zurücksetzen :)
Kounavi
1
Der zweite Teil funktioniert, ist aber etwas ungeschickt. Wie mit Zeilenenden umgegangen wird, hängt vom autocrlfWert ab ... Dies funktioniert je nach den Einstellungen nicht in jedem Projekt.
Sjas
1
Diese Antwort war zum Zeitpunkt der Veröffentlichung angemessen, ist aber jetzt veraltet. git reset somefileund git resetbeide arbeiten jetzt vor dem ersten Commit. Dies ist seit mehreren Git-Veröffentlichungen der Fall.
Mark Amery
@ MarkAmery, Sie haben vielleicht Recht (es wäre cool, wenn Sie eine Quelle für Ihre Behauptung veröffentlichen würden), aber es ist immer noch wertvoll, Ihr Repo mit ein oder zwei sauberen Commits zu starten.
Ryan Lundy
34

Vielleicht hat sich Git weiterentwickelt, seit 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.

Kokotte23
quelle
2
Sicher, aber dann haben Sie die folgende Frage, wie man eine von zwei (oder mehr) hinzugefügten Dateien entfernen soll . Das Handbuch "git reset" erwähnt jedoch, dass "git reset <Pfade>" das Gegenteil von "git add <Pfade>" ist.
Alex North-Keys
34

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)

powlo
quelle
2
Ich habe es versucht git reset <path>und es funktioniert gut ohne Trennzeichen. Ich benutze auch Git 1.9.0. Vielleicht funktioniert es in älteren Versionen nicht?
31

So entfernen Sie neue Dateien aus dem Staging-Bereich (und nur im Falle einer neuen Datei), wie oben vorgeschlagen:

git rm --cached FILE

Verwenden Sie rm --cached nur für neue Dateien, die versehentlich hinzugefügt wurden.

Ran
quelle
4
Beachten Sie, dass dies --cachedhier ein wirklich wichtiger Teil ist.
Takeshin
1
-1; Nein, dies hebt die Datei nicht auf, sondern löscht die Datei (ohne sie tatsächlich aus Ihrem Arbeitsbaum zu löschen).
Mark Amery
25

Mit dem folgenden Befehl können Sie jede Datei in einem bestimmten Ordner (und seinen Unterordnern) zurücksetzen:

git reset *
Zorayr
quelle
4
Tatsächlich wird dadurch nicht jede Datei zurückgesetzt, da * die Shell-Erweiterung verwendet und Punktdateien (und Punktverzeichnisse) ignoriert.
Luc
Sie können laufen git status, um alles zu sehen, was noch übrig ist, und es manuell zurücksetzen, dh git reset file.
Zorayr
25

Verwenden Sie den *Befehl, um mehrere Dateien gleichzeitig zu verarbeiten:

git reset HEAD *.prj
git reset HEAD *.bmp
git reset HEAD *gdb*

usw.

boulder_ruby
quelle
3
Beachten Sie, dass * normalerweise keine Punktedateien oder 'Punktverzeichnisse' enthält, es sei denn, Sie geben ausdrücklich an .*oder.*.prj
Luc
23

Geben git resetSie einfach ein, es wird zurückgesetzt und es ist, als hätten Sie git add .seit Ihrem letzten Commit nie mehr getippt . Stellen Sie sicher, dass Sie sich zuvor verpflichtet haben.

Donovan
quelle
Zufällig gab es ein letztes Commit ... aber ich habe speziell gefragt, ob eine einzelne Datei aus dem Commit entfernt werden soll, nicht jede Datei aus dem Commit.
paxos1977
20

Angenommen, ich erstelle eine neue Datei newFile.txt:

Geben Sie hier die Bildbeschreibung ein

Angenommen, ich füge die Datei versehentlich hinzu git add newFile.txt:

Geben Sie hier die Bildbeschreibung ein

Jetzt möchte ich dieses Hinzufügen vor dem Festschreiben rückgängig machen git reset newFile.txt:

Geben Sie hier die Bildbeschreibung ein

Vidura Mudalige
quelle
Angenommen, ich bin am 1. Bild, was bedeutet, dass ich noch nicht einmal "git.add" gemacht habe. Außerdem möchte ich diese Veränderung überhaupt nicht. Ich meine, wenn ich den Git-Status mache, sollten keine roten Dateien angezeigt werden. Ich meine, es sollte synchron sein, als ob seit dem letzten Git-Push keine einzige Datei geändert worden wäre. wie man das erreicht.
Unbreakable
Nehmen wir also an, Sie sind erst am Anfang. Und Sie möchten alle Änderungen entfernen, die Sie vorgenommen haben, wodurch "newFile.txt" rot angezeigt wird.
Unbreakable
Wenn ich Git-Status mache. Ich sollte überhaupt keine Veränderung sehen. Alle roten Dateien sollten zurückgesetzt werden.
Unbreakable
Hallo, ich denke, Ihre Frage ist, wie Sie nicht verfolgte Dateien aus dem aktuellen Baum entfernen können. Dafür können Sie "git clean -f -d" verwenden. Dadurch werden auch nicht verfolgte Verzeichnisse entfernt.
Vidura Mudalige
Wenn Sie die nicht verfolgten Dateien nicht löschen möchten, ignorieren Sie einfach das Flag "-f".
Vidura Mudalige
19

Für eine bestimmte Datei:

  • git reset my_file.txt
  • git checkout my_file.txt

Für alle hinzugefügten Dateien:

  • Git zurücksetzen.
  • Git Checkout.

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.

Hasib Kamal
quelle
3
Bitte erläutern Sie den Unterschied zwischen git reset <file>und git checkout <file>.
Trent
1
Durch das Zurücksetzen wird die Datei nicht geändert, sondern nur von der Bühne entfernt (= Index, wo sie von git add abgelegt wurde)
Franc
Zur Kasse ändern Sie die Codes in der Datei und wechseln Sie in den zuletzt aktualisierten Status. Beim Zurücksetzen werden die Codes nicht geändert, sondern nur der Header zurückgesetzt. Beispiel: Zurücksetzen der Verwendung für hinzugefügte oder festgeschriebene Dateien, die vor dem Push zurückgesetzt werden, und Auschecken für die Rückkehr zur letzten aktualisierten / festgeschriebenen Phase vor dem Hinzufügen von Git.
Hasib Kamal
1
reset = entferne die Datei von der Bühne, aber die Änderungen bleiben bestehen. checkout = holt die aktualisierte Datei aus dem Repository und überschreibt die aktuelle Datei
Imam Bux
14

Mit diesem Befehl werden Ihre Änderungen aufgehoben:

git reset HEAD filename.txt

Sie können auch verwenden

git add -p 

Teile von Dateien hinzufügen.

Wallerjake
quelle
14

Es gibt auch einen interaktiven Modus:

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, 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

Jonathan
quelle
"Ich bin überrascht, dass niemand den interaktiven Modus erwähnt" - sie taten es: stackoverflow.com/a/10209776/1709587
Mark Amery
14

git addVerwenden Sie zum Rückgängigmachen :

git reset filename
Anirudh Sood
quelle
10
git reset filename.txt

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.

Rahul Sinha
quelle
10

git add myfile.txt # Dadurch wird Ihre Datei in die Liste der festzuschreibenden 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 Status).

Es wird Ihren Kopf mit der angegebenen Datei zurücksetzen. Wenn Ihr Kopf keine Mittel hat, wird er einfach zurückgesetzt.

Mohideen bin Mohammed
quelle
9

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:

Aufheben der Bereitstellung von 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 wird verwendet reset, um neue Dateien zu entfernen.

miva2
quelle
Ja, dieselbe Technik kann mit TortoiseGit verwendet werden , wobei die Git-Befehle für die gängigen Anwendungsfälle abgerufen werden.
Peter Mortensen
8
git reset filename.txt  

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.

Joseph Mathew
quelle
git reset [Dateiname] Beispiel: git reset src / main / java / com / dao / ImportCsvDataDaoImpl.java
Rohit Chaurasiya