Wie verwerfe ich Änderungen in meiner Arbeitskopie, die nicht im Index enthalten sind?
git
version-control
Schreibgeschützt
quelle
quelle
git-clean
nur entfernt untracked Dateien aus dem Arbeits Baum git-scm.com/docs/git-cleangit-clean -df
kann gefährlich sein , Asenars obigen Kommentar zu verdeutlichen . Es werden lokale nicht verfolgte Dateien gelöscht (z. B. von einem .gitignore abgedeckt). Lesen Sie alles unten sorgfältig durch und ziehen Sie das Auschecken von Git in Betracht. stattdessengit status
gibt einen Vorschlag, wie das geht!git checkout -- .
git status
gibt der Vorschlag :git restore
.git restore
ist genau zu diesem Zweck ein neuer Befehl. Siehe mein Update 2019 .Antworten:
Ein weiterer schnellerer Weg ist:
Sie müssen nicht angeben,
--include-untracked
wenn Sie nicht gründlich darüber sein möchten.Danach können Sie diesen Stash mit einem
git stash drop
Befehl löschen, wenn Sie möchten.quelle
--include-untracked
auch.git reset
Befehl verwirft auch Änderungen im Index.git stash
noch eine Vielzahl vongit checkout
werden nicht bereitgestellte Löschvorgänge verwerfen. Laut der Ausgabe vongit status
ist die tatsächlich richtige Antwort hier etwas Geschmackgit reset HEAD
git checkout -- .
erledigt den Job nur mit einem Befehl.Verwenden Sie für alle nicht bereitgestellten Dateien im aktuellen Arbeitsverzeichnis:
Für eine bestimmte Datei verwenden Sie:
--
hier, um die Mehrdeutigkeit von Argumenten zu beseitigen .quelle
git status
error: The following untracked working tree files would be overwritten by checkout: ...
.git checkout -- .
bedeutet dasselbe wiegit checkout .
, außer dass Sie ausdrücklich darauf hinweisen , dass Sie den Filialnamen nicht angeben . Beide sagen, dass sie die HEAD-Version in dem Zweig, in dem ich mich gerade befinde, für '.' oder './'. Wenn Sie diesgit checkout branch-name directory-or-file-name
im Allgemeinen tun , erhalten Sie die HEAD-Version vondirectory-or-file-name
on branchbranch-name
.Es scheint, als wäre die vollständige Lösung:
git clean
Entfernt alle nicht verfolgten Dateien ( Warnung : Ignorierte Dateien, die direkt in .gitignore erwähnt werden, werden zwar nicht gelöscht, ignorierte Dateien in Ordnern werden jedoch möglicherweise gelöscht ) undgit checkout
alle nicht bereitgestellten Änderungen werden gelöscht.quelle
git reset --hard
Dadurch wird der aktuelle Index für das aktuelle Verzeichnis überprüft und alle Änderungen an Dateien aus dem aktuellen Verzeichnis nach unten verworfen.
oder dies, das alle Dateien aus dem Index auscheckt und Arbeitsbaumdateien überschreibt.
quelle
git checkout .
undgit checkout -- .
?git stash save --keep-index
.Bereinigt den Arbeitsbaum durch rekursives Entfernen von Dateien, die nicht der Versionskontrolle unterliegen, beginnend mit dem aktuellen Verzeichnis.
-d
: Entfernen Sie nicht verfolgte Verzeichnisse zusätzlich zu nicht verfolgten Dateien-f
: Force (je nachclean.requireForce
Einstellung möglicherweise nicht erforderlich )Führen
git help clean
Sie das Handbuch ausquelle
Mein Liebling ist
Auf diese Weise können Sie Blöcke selektiv zurücksetzen.
Siehe auch:
quelle
-p
fügt eine schöne zusätzliche Sicherheitsschicht hinzu. Kombiniere es mitgit clean -d
, um OP tatsächlich zu beantworten.Da keine Antwort die genaue Optionskombination vorschlägt, die ich verwende, ist hier:
Dies ist der Online-Hilfetext für die verwendeten
git clean
Optionen:-d
Entfernen Sie nicht verfolgte Verzeichnisse zusätzlich zu nicht verfolgten Dateien. Wenn ein nicht verfolgtes Verzeichnis von einem anderen Git-Repository verwaltet wird, wird es standardmäßig nicht entfernt. Verwenden Sie die
-f
Option zweimal, wenn Sie ein solches Verzeichnis wirklich entfernen möchten.-f
Wenn die Git - Konfigurationsvariable
clean.requireForce
nicht gesetzt istfalse
, wird Git sauber verweigern Dateien oder Verzeichnisse zu löschen , es sei denn gegeben-f
,-n
oder-i
. Git weigert sich, Verzeichnisse innerhalb des.git
Unterverzeichnisses oder der Datei zu löschen , es sei denn, es wird eine Sekunde-f
angegeben.-x
Verwenden Sie nicht die Ignorierregeln von
.gitignore
(pro Verzeichnis) und$GIT_DIR/info/exclude
, sondern die mit-e
Optionen angegebenen Ignorierregeln . Dies ermöglicht das Entfernen aller nicht verfolgten Dateien, einschließlich Build-Produkte. Dies kann (möglicherweise in Verbindung mitgit reset
) verwendet werden, um ein makelloses Arbeitsverzeichnis zum Testen eines sauberen Builds zu erstellen.Außerdem
git checkout .
muss in der Wurzel des Repo durchgeführt werden.quelle
git reset --hard
stattdessen tun können ? (was eigentlich gleichbedeutend mitgit reset --hard HEAD
dem aktuellen Verzeichnis ist und funktionieren sollte ...)git clean -dfx
ist hier ein Tipp, den ich verwende, um vor dem Ausführen auf der sicheren Seite zu sein: Führen Sie ihn einfach ausgit clean -d -x -n
, um die Liste der zu entfernenden Dateien anzuzeigen, und bestätigen Sie den Vorgang durch Ausführengit clean -d -x -f
(ich habe das Argument eingegeben-n
, bzw.-f
am Ende, um es schnell in einem Terminal ändern zu können).gitignore
, verlieren Sie diese. Erwägen Sie daher, Ihr Projekt vorher zu sichern.Wenn Sie lediglich Änderungen an vorhandenen Dateien entfernen möchten , verwenden Sie
checkout
( hier dokumentiert ).--
) teilt Git mit, dass das Folgende als zweites Argument (Pfad) verwendet werden soll, dass Sie die Angabe eines Zweigs übersprungen haben..
) gibt alle Pfade an.Wenn Sie Dateien entfernen möchten , die seit Ihrem letzten Commit hinzugefügt wurden , verwenden Sie
clean
( hier dokumentiert ):-i
Option initiiert eine interaktive Funktionclean
, um fehlerhafte Löschvorgänge zu verhindern.Wenn Sie Änderungen für einen späteren Zugriff in einen Speicherbereich verschieben möchten , verwenden Sie
stash
( hier dokumentiert ):quelle
Ich fand diesen Artikel wirklich hilfreich, um zu erklären, wann welcher Befehl verwendet werden soll: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/
Es gibt verschiedene Fälle:
Wenn Sie die Datei nicht bereitgestellt haben, verwenden Sie
git checkout
. Checkout "Aktualisiert Dateien im Arbeitsbaum, um sie an die Version im Index anzupassen". Wenn die Dateien nicht bereitgestellt wurden (auch bekannt als zum Index hinzugefügt) ... setzt dieser Befehl die Dateien im Wesentlichen auf das zurück, was Sie zuletzt festgeschrieben haben.git checkout -- foo.txt
Wenn Sie die Datei bereitgestellt haben, verwenden Sie git reset. Durch Zurücksetzen wird der Index so geändert, dass er mit einem Commit übereinstimmt.
git reset -- foo.txt
Ich vermute, dass die Verwendung
git stash
eine beliebte Wahl ist, da sie etwas weniger gefährlich ist. Sie können jederzeit darauf zurückgreifen, wenn Sie bei Verwendung des Git-Reset versehentlich zu viel wegblasen. Das Zurücksetzen ist standardmäßig rekursiv.Weitere Hinweise finden Sie im obigen Artikel.
quelle
Der einfachste Weg, dies zu tun, ist die Verwendung dieses Befehls:
Dieser Befehl wird verwendet, um Änderungen im Arbeitsverzeichnis zu verwerfen -
https://git-scm.com/docs/git-checkout
Im Befehl git wird das Verstauen von nicht verfolgten Dateien erreicht, indem Folgendes verwendet wird:
http://git-scm.com/docs/git-stash
quelle
.
am Ende vergessen . Für die Zukunft: Die Zeit ist entscheidend !git clean -fd
um Dateien zu bereinigen, die nicht im Index enthalten sind.Wenn Sie nicht daran interessiert sind, die nicht bereitgestellten Änderungen beizubehalten (insbesondere wenn es sich bei den bereitgestellten Änderungen um neue Dateien handelt), fand ich dies praktisch:
quelle
git checkout -f
man git-checkout
::-f, --force
Fahren Sie beim Wechseln der Zweige fort, auch wenn sich der Index oder der Arbeitsbaum von HEAD unterscheidet. Dies wird verwendet, um lokale Änderungen wegzuwerfen.
Scheitern Sie beim Auschecken von Pfaden aus dem Index nicht bei nicht zusammengeführten Einträgen. Stattdessen werden nicht zusammengeführte Einträge ignoriert.
quelle
Während Sie den Git-Status eingeben (verwenden Sie "Git-Checkout - ...", um Änderungen im Arbeitsverzeichnis zu verwerfen), wird angezeigt.
z.B
git checkout -- .
quelle
Sie können Git Stash verwenden - wenn etwas schief geht, können Sie trotzdem aus dem Stash zurückkehren. Ähnlich wie bei einer anderen Antwort hier, aber diese entfernt auch alle nicht bereitgestellten Dateien und auch alle nicht bereitgestellten Löschvorgänge:
Wenn Sie überprüfen, ob alles in Ordnung ist, werfen Sie den Vorrat weg:
Die Antwort von Bilal Maqsood mit hat
git clean
auch für mich funktioniert, aber mit dem Vorrat habe ich mehr Kontrolle - wenn ich etwas versehentlich mache, kann ich meine Änderungen immer noch zurückbekommenAKTUALISIEREN
Ich denke, es gibt noch 1 Änderung (ich weiß nicht, warum das bei mir vorher funktioniert hat):
git add . -A
anstattgit add .
ohne die werden
-A
die entfernten Dateien nicht inszeniertquelle
Update 2019:
Seit Juli 2019 gibt es einen neuen Befehl, der genau dies tut :
git restore
.In
git status
, jetzt empfiehlt Git, diesen Befehl anstelle vongit checkout
früher zu verwenden.Während dieser Befehl auch verwendet werden kann, um den Arbeitsbaum in einem bestimmten Commit wiederherzustellen oder um den Inhalt des Index wiederherzustellen, wird der Arbeitsbaum standardmäßig auf den Status im Index zurückgesetzt (was hier gefragt wird).
Um die Dateien wiederherzustellen, die einer Pfadspezifikation entsprechen (um ihre nicht bereitgestellten Änderungen zu entfernen), gehen Sie wie folgt vor:
Um beispielsweise alle nicht bereitgestellten Änderungen im aktuellen Verzeichnis wiederherzustellen, können Sie Folgendes ausführen:
Wenn Sie dies im Stammverzeichnis des Projekts ausführen, werden alle nicht bereitgestellten Änderungen im gesamten Repository wiederhergestellt.
Beachten Sie, dass wie bei
git checkout -- .
(wie von Mariusz Nowak hervorgehoben) nur Änderungen an von Git verfolgten Dateien verworfen werden und keine neuen nicht verfolgten Dateien verworfen werden. Wenn Sie nicht bereitgestellte Änderungen, einschließlich neuer nicht verfolgter Dateien, verwerfen möchten, können Sie Folgendes ausführen:Seien Sie mit diesem späteren Befehl jedoch sehr vorsichtig, da Sie möglicherweise Dateien verwerfen, die Sie nicht entfernen wollten.
Hinweis zu
git restore
: Da dies ein neuer Befehl ist, gibt die Manpage eine Warnung aus:Es ist also möglich, dass diese Antwort veraltet ist, wenn sich das Verhalten in Zukunft ändert. Es kann daher ratsam sein,
man git-restore
vor der Verwendung eine schnelle Ausführung durchzuführen .quelle
git restore .
einwandfrei funktioniert. Vielen Dank.git restore <filename>
es getan und es hat perfekt funktioniert.git restore .
alle Dateien im aktuellen Verzeichnis wiederhergestellt, nicht im gesamten Repository.Anstatt Änderungen zu verwerfen, setze ich meine Fernbedienung auf den Ursprung zurück. Hinweis - Mit dieser Methode können Sie Ihren Ordner vollständig auf den des Repos zurücksetzen.
Also mache ich das, um sicherzustellen, dass sie nicht dort sitzen, wenn ich git zurücksetze (später - schließt gitignores im Origin / branchname aus)
HINWEIS: Wenn Sie Dateien behalten möchten, die noch nicht verfolgt wurden, aber nicht in GITIGNORE, können Sie diesen Schritt überspringen, da diese nicht verfolgten Dateien gelöscht werden, die nicht in Ihrem Remote-Repository gefunden wurden (danke @XtrmJosh).
Dann ich
Dann setze ich auf Ursprung zurück
Das wird es wieder auf den ersten Platz bringen. Genau wie beim erneuten Klonen des Zweigs, während alle meine gitignored Dateien lokal und an Ort und Stelle bleiben.
Aktualisiert pro Benutzerkommentar unten: Variation zum Zurücksetzen auf den aktuellen Zweig, in dem sich der Benutzer befindet.
quelle
git reset --hard @{u}
die den ZweigVersuchte alle oben genannten Lösungen, konnte aber immer noch keine neuen, nicht bereitgestellten Dateien entfernen.
Verwenden Sie
git clean -f
diese Option , um diese neuen Dateien zu entfernen - allerdings mit Vorsicht! Beachten Sie die Force-Option.quelle
einfach sagen
Es werden alle Ihre lokalen Änderungen entfernt. Sie können auch später verwenden, indem Sie sagen
oder Git Stash Pop
quelle
Benutz einfach:
Erledigt. Einfach.
Wenn Sie sich wirklich für Ihren Stash-Stack interessieren, können Sie mit folgen
git stash drop
. Aber an diesem Punkt ist es besser, wenn Sie (von Mariusz Nowak) verwenden:Trotzdem gefällt mir
git stash -u
das am besten, weil es alle verfolgten und nicht verfolgten Änderungen in nur einem Befehl "verwirft" . Es werden jedochgit checkout -- .
nur nachverfolgte Änderungen undgit clean -df
nur nicht nachverfolgte Änderungen verworfen ... und das Eingeben beider Befehle ist viel zu viel Arbeit :)quelle
git stash -u
Wird sich bald (Git 2.14.x / 2.15, Q3 2017) etwas weiterentwickeln: stackoverflow.com/a/46027357/6309git stash -k
meiner Meinung nach sein.So machen Sie einen dauerhaften Rückwurf:
git reset --hard
So speichern Sie Änderungen für später:
git stash
quelle
Dies funktioniert sogar in Verzeichnissen, die sind; außerhalb der normalen Git-Berechtigungen.
Ist mir kürzlich passiert
quelle
git help clean
"-d Entfernen Sie nicht verfolgte Verzeichnisse zusätzlich zu nicht verfolgten Dateien."Sie haben einen sehr einfachen Git-Befehl
git checkout .
quelle
quelle
Meiner Meinung nach,
sollte den Trick machen. Laut Git-Dokumentation zu Git Clean
Beschreibung
Optionen
quelle
Unabhängig davon, in welchem Zustand sich Ihr Repo befindet, können Sie jederzeit auf ein vorheriges Commit zurücksetzen:
Dadurch werden alle Änderungen verworfen, die nach diesem Commit vorgenommen wurden.
quelle
Eine andere Möglichkeit, neue Dateien zu entfernen, die spezifischer sind als git clean -df (es ermöglicht Ihnen, einige Dateien nicht unbedingt alle zu entfernen), besteht darin, die neuen Dateien zuerst zum Index hinzuzufügen, dann zu speichern und dann zu löschen verstauen.
Diese Technik ist nützlich, wenn Sie aus irgendeinem Grund nicht einfach alle nicht verfolgten Dateien mit einem normalen Mechanismus (wie rm) löschen können.
quelle
Was folgt, ist eigentlich nur eine Lösung, wenn Sie mit einem Zweig eines Repositorys arbeiten, in dem Sie regelmäßig mit einem anderen Repo synchronisieren (z. B. Pull Request). Kurze Antwort: Gabel und Gabel löschen, aber die Warnungen auf Github lesen .
Ich hatte ein ähnliches Problem, vielleicht nicht identisch, und ich bin traurig zu sagen, dass meine Lösung nicht ideal ist, aber letztendlich effektiv.
Ich hatte oft Git-Statusmeldungen wie diese (mit mindestens 2/4 Dateien):
Ein scharfes Auge wird bemerken, dass diese Dateien Dopplegänger haben, die im Falle eines Ausfalls ein einzelner Buchstabe sind. Irgendwie, und ich habe keine Ahnung, was mich zu diesem Weg geführt hat (da ich nicht selbst mit diesen Dateien vom Upstream-Repo aus gearbeitet habe), hatte ich diese Dateien gewechselt. Probieren Sie die vielen auf dieser Seite (und anderen Seiten) aufgeführten Lösungen aus, die nicht zu helfen schienen.
Ich konnte das Problem beheben, indem ich mein gegabeltes Repository und alle lokalen Repositorys löschte und neu gabelte. Das allein war nicht genug; upstream musste die fraglichen Dateien in neue Dateinamen umbenennen. Solange Sie keine nicht festgeschriebene Arbeit, keine Wikis und keine Probleme haben, die vom Upstream-Repository abweichen, sollte es Ihnen gut gehen. Upstream ist vielleicht nicht sehr glücklich mit Ihnen, um es gelinde auszudrücken. Was mein Problem betrifft, ist es zweifellos ein Benutzerfehler, da ich nicht so gut mit Git umgehen kann, aber die Tatsache, dass es alles andere als einfach ist, Punkte auf ein Problem mit Git zu beheben.
quelle
Wenn Sie einen Vorrat an eine andere Person übertragen möchten:
[Bearbeiten] Wie kommentiert, ist es möglich, Verstecke zu benennen. Verwenden Sie dies, wenn Sie Ihren Vorrat teilen möchten;)
quelle
git stash save "Feature X work in progress"
.Sie können einen eigenen Alias erstellen, der beschreibt, wie dies auf beschreibende Weise getan wird.
Ich verwende den nächsten Alias, um Änderungen zu verwerfen.
Verwerfen Sie Änderungen in einer (Liste von) Datei (en) im Arbeitsbaum
Dann können Sie es als nächstes verwenden, um alle Änderungen zu verwerfen:
Oder nur eine Datei:
Andernfalls verwende ich eine Mischung aus Auschecken und Bereinigen, wenn Sie alle Änderungen und auch die nicht verfolgten Dateien verwerfen möchten:
Bereinigen und verwerfen Sie Änderungen und nicht verfolgte Dateien im Arbeitsbaum
So ist die Verwendung wie folgt einfach:
Jetzt ist es im nächsten Github-Repo verfügbar, das viele Aliase enthält:
quelle
Ich hatte eine seltsame Situation, in der eine Datei immer nicht bereitgestellt ist. Dies hilft mir bei der Lösung.
quelle