Ich habe versehentlich viele temporäre Dateien mit hinzugefügt git add -A
Ich habe es geschafft, die Dateien mit den folgenden Befehlen zu entfernen und den schmutzigen Index zu entfernen.
git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
Die obigen Befehle sind in der Liste aufgeführt git help rm
. Leider wurden meine Dateien auch bei der Ausführung gelöscht, obwohl ich die Cache-Option angegeben hatte. Wie kann ich den Index löschen, ohne den Inhalt zu verlieren?
Es wäre auch hilfreich, wenn jemand erklären könnte, wie dieser Rohrbetrieb funktioniert.
git
version-control
Sarat
quelle
quelle
rm -f
ist kein git-Befehl und hat keine--cached
Option. Ihre lokalen Dateien wurden vor Ihrer Ausführung gelöscht, daher können Siegit rm
meiner Meinung nach nichtgit rm
für irgendetwas verantwortlich gemacht werden.git reset --hard
ist nicht die richtige Antwort und wird in der Tat den Inhalt löschen. Dies wird die Benutzer verwirren - genau wie ich.Antworten:
git reset
Wenn Sie nur einen übereifrigen "git add" -Lauf rückgängig machen möchten:
Ihre Änderungen werden nicht bereitgestellt und können nach Belieben erneut hinzugefügt werden.
NICHT LAUFEN
git reset --hard
.Dadurch werden nicht nur Ihre hinzugefügten Dateien entfernt, sondern alle Änderungen, die Sie in Ihrem Arbeitsverzeichnis vorgenommen haben, werden zurückgesetzt. Wenn Sie neue Dateien im Arbeitsverzeichnis erstellt haben, werden diese jedoch nicht gelöscht.
quelle
git checkout -- *
auchWenn Sie ein makelloses Repo haben (oder HEAD nicht eingestellt ist) [1], können Sie dies einfach tun
Natürlich wird dies Sie benötigen die Dateien erneut hinzufügen , dass Sie haben hinzugefügt werden soll.
[1] Beachten Sie (wie in den Kommentaren erläutert), dass dies normalerweise nur dann geschieht, wenn das Repo brandneu ("makellos") ist oder wenn keine Commits vorgenommen wurden. Technisch gesehen immer dann, wenn es keine Kasse oder keinen Arbeitsbaum gibt.
Nur um es klarer zu machen :)
quelle
Verwenden Sie
git reset HEAD
diese Option, um den Index zurückzusetzen, ohne Dateien zu entfernen. (Wenn Sie nur eine bestimmte Datei im Index zurücksetzen möchten, können Sie diesgit reset HEAD -- /path/to/file
tun.)Der Rohrbetreiber nimmt in einer Schale
stdout
den Prozess auf der linken Seite und leitet ihnstdin
an den Prozess auf der rechten Seite weiter. Es ist im Wesentlichen das Äquivalent von:Stattdessen kann
$ proc1 | proc2
der zweite Prozess Daten abrufen, bevor der erste die Ausgabe beendet hat, und es ist keine tatsächliche Datei beteiligt.quelle
git reset HEAD
ohne etwas anderes anzugeben, und der gesamte Index wird zurückgesetzt. Sie können dann nur die gewünschten Dateien erneut hinzufügen.$ git reset HEAD fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
git reset
dann, ohne dieHEAD
.$ git reset fatal: Failed to resolve 'HEAD' as a valid ref.
quelle
Wenn HEAD nicht festgelegt ist (dh Sie haben noch keine Commits, möchten aber nicht einfach wegblasen,
.git
weil Sie bereits eine andere Repo-Konfiguration eingerichtet haben, die Sie beibehalten möchten), können Sie dies auch tunalles zu inszenieren. Dies ist praktisch das Gleiche wie die Lösung von sehe, vermeidet jedoch das Durcheinander mit Git-Interna.
quelle
.git
weil Sie eine andere Repo-Konfiguration eingerichtet haben behalten wollen. Ich habe bearbeitet, um dies zu verdeutlichen.Warnung: Verwenden Sie den folgenden Befehl nur, wenn Sie nicht festgeschriebene Arbeit verlieren möchten!
Die Verwendung
git reset
wurde erklärt, aber Sie haben auch um eine Erklärung der Pipe-Befehle gebeten.Der Befehl
git ls-files
listet alle Dateien auf, die git kennt. Die Option-z
legt ihnen ein bestimmtes Format auf, das von ihnen erwartete Formatxargs -0
, das sie dann aufruft. Diesrm -f
bedeutet, dass sie entfernt werden müssen, ohne auf Ihre Zustimmung zu prüfen.Mit anderen Worten: "Listen Sie alle Dateien auf, die git kennt, und entfernen Sie Ihre lokale Kopie".
Dann kommen wir zu
git diff
, was Änderungen zwischen verschiedenen Versionen von Elementen zeigt, über die Git Bescheid weiß. Dies können Änderungen zwischen verschiedenen Bäumen, Unterschiede zwischen lokalen Kopien und Remote-Kopien usw. sein.Wie hier verwendet, werden die nicht bereitgestellten Änderungen angezeigt. die Dateien, die Sie geändert, aber noch nicht festgeschrieben haben. Die Option
--name-only
bedeutet, dass Sie nur die (vollständigen) Dateinamen möchten und--diff-filter=D
dass Sie nur an gelöschten Dateien interessiert sind. (Hey, haben wir nicht einfach ein paar Sachen gelöscht?) Dies wird dann in dasxargs -0
zuvor gesehene geleitet, was sie aufruftgit rm --cached
, was bedeutet, dass sie aus dem Cache entfernt werden, während der Arbeitsbaum in Ruhe gelassen werden sollte - außer das Sie haben gerade alle Dateien aus Ihrem Arbeitsbaum entfernt. Jetzt werden sie auch aus Ihrem Index entfernt.Mit anderen Worten, alle bereitgestellten oder nicht bereitgestellten Änderungen sind weg und Ihr Arbeitsbaum ist leer. Weinen Sie, checken Sie Ihre Dateien frisch vom Ursprung oder von der Fernbedienung aus und wiederholen Sie Ihre Arbeit. Verfluche den Sadisten, der diese höllischen Zeilen geschrieben hat; Ich habe überhaupt keine Ahnung, warum jemand dies tun möchte.
TL; DR: Sie haben einfach alles abgespritzt; von vorne beginnen und
git reset
von nun an verwenden.quelle
Ich befürchte, dass die erste dieser Befehlszeilen alle Dateien, die sich im Staging-Bereich von git befinden, bedingungslos aus der Arbeitskopie gelöscht hat. Die zweite hat alle Dateien aufgehoben, die verfolgt wurden, aber jetzt gelöscht wurden. Leider bedeutet dies, dass Sie alle nicht festgeschriebenen Änderungen an diesen Dateien verloren haben.
Wenn Sie Ihre Arbeitskopie und Ihren Index wieder auf den Stand beim letzten Festschreiben bringen möchten , können Sie den folgenden Befehl ( vorsichtig ) verwenden:
Ich sage "vorsichtig", da
git reset --hard
nicht festgeschriebene Änderungen in Ihrer Arbeitskopie und Ihrem Index verwischt werden. In dieser Situation klingt es jedoch so, als ob Sie bei Ihrem letzten Commit nur in den Status zurückkehren möchten, und die nicht festgeschriebenen Änderungen sind trotzdem verloren gegangen.Update: Aus Ihren Kommentaren zu Bernsteins Antwort geht hervor, dass Sie noch keine Commits erstellt haben (da HEAD nicht aufgelöst werden kann). Dies wird also leider nicht helfen.
Wie diese Pipes funktionieren:
git ls-files -z
undgit diff --name-only --diff-filter=D -z
beide geben eine Liste von Dateinamen aus, die durch das Byte getrennt sind0
. (Dies ist nützlich, da im Gegensatz zu Zeilenumbrüchen0
Bytes in Dateinamen auf Unix-ähnlichen Systemen garantiert nicht vorkommen.) Das Programm erstelltxargs
Befehlszeilen im Wesentlichen aus seiner Standardeingabe, indem standardmäßig Zeilen aus der Standardeingabe übernommen und am Ende hinzugefügt werden der Kommandozeile. Die-0
Option besagt, dass die Standardeingabe durch0
Bytes getrennt erwartet wird .xargs
Möglicherweise wird der Befehl mehrmals aufgerufen, um alle Parameter aus der Standardeingabe zu verbrauchen und sicherzustellen, dass die Befehlszeile niemals zu lang wird.Als einfaches Beispiel, wenn Sie eine Datei
test.txt
mit dem folgenden Inhalt aufgerufen haben :... dann
xargs echo whatever < test.txt
ruft der Befehl den Befehl auf:quelle
Wenn Sie alle Änderungen aufheben möchten, verwenden Sie den folgenden Befehl:
Wenn Sie Änderungen entfernen und aus dem Arbeitsverzeichnis zurücksetzen möchten,
quelle