it-swarm-eu.dev

Wie mache ich 'git add' rückgängig, bevor ich festschreibe?

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?

8347
paxos1977

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

9480
genehack

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:

  1. cd in mein tolles neues projektverzeichnis zum ausprobieren von git, der neuen hotness
  2. git init
  3. git add .
  4. git status

    ... viele Schriftrollen von ...

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

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

    => Stack Overflow finden - yay

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

2082
Rhubarb

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)
515
Paul Beckingham

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
241
takeshin

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:

  1. Wenn <file> zuvor nicht verfolgt wurde , fügt git add ihn mit seinem aktuellen Inhalt dem Cache hinzu.

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

161
leonbloy
git rm --cached . -r

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

92
braitsch

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:

git reset HEAD file

90
Alireza

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.

86

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:

  • Eine Datei geändert und 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>
    
80
sjas

Die Frage ist nicht klar gestellt. Der Grund ist, dass _git add_ zwei Bedeutungen hat:

  1. hinzufügen eines neue Datei zum Staging-Bereich, dann Rückgängigmachen mit _git rm --cached file_.
  2. hinzufügen einer geänderten -Datei zum Staging-Bereich, dann Rückgängigmachen mit _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
_
74
Michael_Scharf

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

63
Paul Betts

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
55
electblake

Hierfür kann git remove oder git rm mit dem Flag --cached verwendet werden. Versuchen:

git help rm
43
gnud

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)
$
42
Alex North-Keys

So vermeiden Sie dieses störende Problem, wenn Sie ein neues Projekt starten:

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

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:

  • Sehen Sie sich das erste Commit an. Dadurch werden alle Ihre Dateien entfernt.
  • Überprüfen Sie dann erneut Ihr aktuelles Commit. Dadurch werden neue Kopien Ihrer Dateien mit den aktuellen Einstellungen für das Zeilenende abgerufen.
37
Ryan Lundy

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.

33
Kokotte23

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)

33
powlo

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.

30
Ran

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

git reset *
24
Zorayr

verwenden Sie den Befehl *, um mehrere Dateien gleichzeitig zu verarbeiten

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

usw

24
boulder_ruby

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.

22
Donovan

Angenommen, ich erstelle eine neue Datei newFile.txt.

enter image description here

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

enter image description here

Jetzt möchte ich dieses Hinzufügen rückgängig machen, bevor ich festschreibe, git reset newFile.txt

enter image description here

18
Vidura Mudalige

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.

17
Hasib Kamal

Um git rückgängig zu machen, fügen Sie use hinzu

git reset filename

13
Anirudh Sood

Dieser Befehl entpackt Ihre Änderungen:

git reset HEAD filename.txt

Sie können auch verwenden

git add -p 

um Teile von Dateien hinzuzufügen.

13
wallerjake

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-Staging-Dateien

13
Jonathan

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.

9
Rahul Sinha

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.

8
miva2
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.

7
Joseph Mathew

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 enter image description here

7
Marcin Szymczak

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.

1
SAIguru011