Wie verwerfe ich nicht bereitgestellte Änderungen in Git?

4818

Wie verwerfe ich Änderungen in meiner Arbeitskopie, die nicht im Index enthalten sind?

Schreibgeschützt
quelle
9
git-cleannur entfernt untracked Dateien aus dem Arbeits Baum git-scm.com/docs/git-clean
Yega
24
Es git-clean -dfkann 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. stattdessen
Jacanterbury
15
'git clean -df' Sei gewarnt! Ich habe das versucht und Schlüsselordner verloren, die nicht wiederhergestellt werden können ... Autsch!
Gabe Karkanis
46
Schlagen git statusgibt einen Vorschlag, wie das geht! git checkout -- .
Paulo
4
@Paulo: Ab Juli 2019 git statusgibt der Vorschlag : git restore. git restoreist genau zu diesem Zweck ein neuer Befehl. Siehe mein Update 2019 .
Prosoitos

Antworten:

2684

Ein weiterer schnellerer Weg ist:

git stash save --keep-index --include-untracked

Sie müssen nicht angeben, --include-untrackedwenn Sie nicht gründlich darüber sein möchten.

Danach können Sie diesen Stash mit einem git stash dropBefehl löschen, wenn Sie möchten.

Greg Hewgill
quelle
122
Und um gründlich zu sein, möchten Sie --include-untrackedauch.
TJ Crowder
9
@KarimSamir: Die Frage fragt speziell nach Änderungen, die nicht im Index enthalten sind . Der git resetBefehl verwirft auch Änderungen im Index.
Greg Hewgill
146
Git Checkout -. ist viel schneller
Frank
38
Weder die git stashnoch eine Vielzahl von git checkoutwerden nicht bereitgestellte Löschvorgänge verwerfen. Laut der Ausgabe von git statusist die tatsächlich richtige Antwort hier etwas Geschmackgit reset HEAD
Chris Warth
127
Dies verschmutzt den Stash-Stack. git checkout -- .erledigt den Job nur mit einem Befehl.
Felipe Tonello
5336

Verwenden Sie für alle nicht bereitgestellten Dateien im aktuellen Arbeitsverzeichnis:

git checkout -- .

Für eine bestimmte Datei verwenden Sie:

git checkout -- path/to/file/to/revert

--hier, um die Mehrdeutigkeit von Argumenten zu beseitigen .

Tobi
quelle
117
Dies scheint der kanonische Weg zu sein. dh genau das, was Git dir sagt, wenn du git status
tippst
27
Funktioniert nicht, wenn nicht verfolgte Dateien vorhanden sind. Git sagt error: The following untracked working tree files would be overwritten by checkout: ....
Michael Iles
92
Neuling Frage, was bedeutet "Git Checkout -". semantisch bedeuten?
Kaid
120
@Ninjack git checkout -- .bedeutet dasselbe wie git 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 dies git checkout branch-name directory-or-file-nameim Allgemeinen tun , erhalten Sie die HEAD-Version von directory-or-file-nameon branch branch-name.
Akgill
23
IMO ist diese Variante nicht perfekt, da sie keine Situation behandelt, in der sich Ihr geändertes Repository zum Zeitpunkt der Bereinigung der Änderungen nicht in der HEAD-Revision befindet und Sie es NICHT auf HEAD aktualisieren möchten und nur die Änderungen bereinigen möchten.
Alexykot
1899

Es scheint, als wäre die vollständige Lösung:

git clean -df
git checkout -- .

git cleanEntfernt 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 ) und git checkoutalle nicht bereitgestellten Änderungen werden gelöscht.

Mariusz Nowak
quelle
116
Die anderen beiden Antworten funktionieren nicht wirklich, diese hat es getan.
John Hunt
18
@dval Dies liegt daran, dass der erste Befehl die nicht indizierten Dateien und der zweite die nicht bereitgestellten Änderungen (der indizierten Dateien) entfernt hat. Wenn Sie also keine inszenierten Änderungen vorgenommen haben, entspricht dies der Rückkehr zum letzten Commit mitgit reset --hard
Amanuel Nega,
3
Verwenden Sie -dff, wenn das nicht verfolgte Verzeichnis ein Git-Klon ist.
Accuya
87
Seien Sie vorsichtig, wenn Sie git clean -df ausführen. Wenn Sie nicht verstehen, was es tut, löschen Sie möglicherweise Dateien, die Sie behalten
möchten
40
Wie @ctlockey sagte, löscht der erste Befehl auch Verzeichnisse, wenn sie nur aus ignorierten Dateien bestehen ... Ich habe eine ganze Reihe von Konfigurationsdateien in meinem Projekt verloren :( Seien Sie vorsichtig.
Maxime Lorant
326

Dadurch wird der aktuelle Index für das aktuelle Verzeichnis überprüft und alle Änderungen an Dateien aus dem aktuellen Verzeichnis nach unten verworfen.

git checkout .

oder dies, das alle Dateien aus dem Index auscheckt und Arbeitsbaumdateien überschreibt.

git checkout-index -a -f
CB Bailey
quelle
28
Hallo, was ist der Unterschied zwischen git checkout .und git checkout -- .?
Evan Hu
5
@Evan: Kein Unterschied in diesem Fall.
Robert Siemer
10
@ Robert Siemer und im allgemeinen Fall?
RJFalconer
2
@Evan: schlechter Ort, um diese Frage zu stellen. - Es hat nichts mit der Frage des OP zu tun und nichts mit der Antwort hier.
Robert Siemer
14
+1 Dies ist die RICHTIGE ANTWORT, da sie den Fall korrekt behandelt, in dem einige Dateien sowohl bereitgestellte als auch nicht bereitgestellte Änderungen aufweisen. Beachten Sie, dass diese Lösung die nicht bereitgestellten Änderungen verwirft. Wenn Sie sie behalten möchten, sollten Sie die Antwort von @ greg-hewgill von verwenden git stash save --keep-index.
Rhubbarb
248
git clean -df

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 nach clean.requireForceEinstellung möglicherweise nicht erforderlich )

Führen git help cleanSie das Handbuch aus

Elvis Ciotti
quelle
Warum hat diese Antwort nicht alle Stimmen? antwortete im Jahr 2011 und immer noch richtig.
Eugene Braginets
106

Mein Liebling ist

git checkout -p

Auf diese Weise können Sie Blöcke selektiv zurücksetzen.

Siehe auch:

git add -p
Ben
quelle
9
Ich liebe die Fähigkeit, die tatsächliche Änderung zu sehen, bevor sie verworfen wird.
Penghe Geng
Das benutze ich. git checkout -p und dann "a", um alle zu akzeptieren.
Mattis
2
Ich habe nie darüber nachgedacht. Das -pfügt eine schöne zusätzliche Sicherheitsschicht hinzu. Kombiniere es mit git clean -d, um OP tatsächlich zu beantworten.
Stephan Henningsen
96

Da keine Antwort die genaue Optionskombination vorschlägt, die ich verwende, ist hier:

git clean -dfx
git checkout .

Dies ist der Online-Hilfetext für die verwendeten git cleanOptionen:

-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 -fOption zweimal, wenn Sie ein solches Verzeichnis wirklich entfernen möchten.

-f

Wenn die Git - Konfigurationsvariable clean.requireForcenicht gesetzt ist false, wird Git sauber verweigern Dateien oder Verzeichnisse zu löschen , es sei denn gegeben -f, -noder -i. Git weigert sich, Verzeichnisse innerhalb des .gitUnterverzeichnisses oder der Datei zu löschen , es sei denn, es wird eine Sekunde -fangegeben.

-x

Verwenden Sie nicht die Ignorierregeln von .gitignore(pro Verzeichnis) und $GIT_DIR/info/exclude, sondern die mit -eOptionen angegebenen Ignorierregeln . Dies ermöglicht das Entfernen aller nicht verfolgten Dateien, einschließlich Build-Produkte. Dies kann (möglicherweise in Verbindung mit git 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.

Martin G.
quelle
+1 für diese Lösung. In Bezug auf Ihre Bemerkung, dass "Git Checkout. Muss im Stammverzeichnis des Repos durchgeführt werden", könnten Sie vielleicht erwähnen, dass wir dies git reset --hardstattdessen tun können ? (was eigentlich gleichbedeutend mit git reset --hard HEADdem aktuellen Verzeichnis ist und funktionieren sollte ...)
ErikMD
2
Auch in Bezug auf den ersten Befehl git clean -dfxist hier ein Tipp, den ich verwende, um vor dem Ausführen auf der sicheren Seite zu sein: Führen Sie ihn einfach aus git clean -d -x -n, um die Liste der zu entfernenden Dateien anzuzeigen, und bestätigen Sie den Vorgang durch Ausführen git clean -d -x -f(ich habe das Argument eingegeben -n, bzw. -fam Ende, um es schnell in einem Terminal ändern zu können)
ErikMD
5
Beachten Sie schnell, dass dies nicht rückgängig gemacht werden kann. Wenn Sie Dateien enthalten .gitignore, verlieren Sie diese. Erwägen Sie daher, Ihr Projekt vorher zu sichern.
Rob
69

Wenn Sie lediglich Änderungen an vorhandenen Dateien entfernen möchten , verwenden Sie checkout( hier dokumentiert ).

git checkout -- .
  • Da kein Zweig angegeben ist, wird der aktuelle Zweig ausgecheckt.
  • Der doppelte Bindestrich ( --) teilt Git mit, dass das Folgende als zweites Argument (Pfad) verwendet werden soll, dass Sie die Angabe eines Zweigs übersprungen haben.
  • Der Punkt ( .) gibt alle Pfade an.

Wenn Sie Dateien entfernen möchten , die seit Ihrem letzten Commit hinzugefügt wurden , verwenden Sie clean( hier dokumentiert ):

git clean -i 
  • Die -iOption initiiert eine interaktive Funktion clean, um fehlerhafte Löschvorgänge zu verhindern.
  • Für eine schnellere Ausführung stehen eine Handvoll anderer Optionen zur Verfügung. siehe die Dokumentation.

Wenn Sie Änderungen für einen späteren Zugriff in einen Speicherbereich verschieben möchten , verwenden Sie stash( hier dokumentiert ):

git stash
  • Alle Änderungen werden für einen späteren Zugriff in Git's Stash verschoben.
  • Für eine differenziertere Aufbewahrung stehen eine Handvoll Optionen zur Verfügung. siehe die Dokumentation.
2540625
quelle
Dadurch werden Ihre Änderungen genau konvertiert und neu hinzugefügte Dateien aus dem vorherigen Commit verworfen.
Yohan Chung
hat dies für die Erklärung positiv bewertet :)
Archie G. Quiñones
62

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:

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

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

blak3r
quelle
60

Der einfachste Weg, dies zu tun, ist die Verwendung dieses Befehls:

Dieser Befehl wird verwendet, um Änderungen im Arbeitsverzeichnis zu verwerfen -

git checkout -- .

https://git-scm.com/docs/git-checkout

Im Befehl git wird das Verstauen von nicht verfolgten Dateien erreicht, indem Folgendes verwendet wird:

git stash -u

http://git-scm.com/docs/git-stash

AHM Forhadul Islam
quelle
19
Zweimal bin ich hierher gekommen, habe diese Antwort gelesen und .am Ende vergessen . Für die Zukunft: Die Zeit ist entscheidend !
Bejado
2
Ich musste alle lokalen Änderungen in einem Unterverzeichnis entfernen, ohne jede andere Änderung wegzublasen. Diese Antwort hat sehr geholfen, danke
Ally
2
Bitte beschreiben Sie, was die beiden Befehle tun. Es ist wirklich nicht hilfreich, keine Erklärung zu haben.
Chris Kennedy
2
Ausgezeichnet. Die Kasse macht in einem Befehl das, was die beliebteste in zwei macht. kann auch verfolgt werden, git clean -fdum Dateien zu bereinigen, die nicht im Index enthalten sind.
Oligofren
49

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:

git diff | git apply --reverse
Joshua Kunzmann
quelle
44

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.

Bijan
quelle
2
Dies würde Änderungen im Index verwerfen !! (Und das OP muss sie so lassen, wie sie sind.)
Robert Siemer
44

Während Sie den Git-Status eingeben (verwenden Sie "Git-Checkout - ...", um Änderungen im Arbeitsverzeichnis zu verwerfen), wird angezeigt.

z.B git checkout -- .

Erdem ÖZDEMİR
quelle
1
Downvoted, da es nicht hilft, alle Dateien schnell zu verwerfen. Die drei Punkte zeigen an, dass Sie alle Dateien auflisten müssen. Dies ist besonders schlimm, wenn Sie Tonnen von Dateien gleichzeitig verwerfen müssen, z. während einer großen Zusammenführung, nachdem Sie alle Änderungen vorgenommen haben, die Sie behalten
möchten
2
Der richtige Befehl lautet natürlich "git checkout -". ein einzelner Punkt. In dem Kommentar waren die drei Punkte eine grammatikalische Sache, um anzuzeigen, dass es viele andere Optionen gibt, die verwendet werden könnten.
Josef.B
39

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:

git add .
git stash

Wenn Sie überprüfen, ob alles in Ordnung ist, werfen Sie den Vorrat weg:

git stash drop

Die Antwort von Bilal Maqsood mit hat git cleanauch für mich funktioniert, aber mit dem Vorrat habe ich mehr Kontrolle - wenn ich etwas versehentlich mache, kann ich meine Änderungen immer noch zurückbekommen

AKTUALISIEREN

Ich denke, es gibt noch 1 Änderung (ich weiß nicht, warum das bei mir vorher funktioniert hat):

git add . -A anstatt git add .

ohne die werden -Adie entfernten Dateien nicht inszeniert

Asped
quelle
38

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 von git checkoutfrü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:

git restore <pathspec>

Um beispielsweise alle nicht bereitgestellten Änderungen im aktuellen Verzeichnis wiederherzustellen, können Sie Folgendes ausführen:

git restore .

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:

git clean -df

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:

Dieser Befehl ist experimentell. Das Verhalten kann sich ändern.

Es ist also möglich, dass diese Antwort veraltet ist, wenn sich das Verhalten in Zukunft ändert. Es kann daher ratsam sein, man git-restorevor der Verwendung eine schnelle Ausführung durchzuführen .

Prosoitos
quelle
2
Ich wollte meine nicht bereitgestellten Änderungen nur rückgängig machen, ohne die neu hinzugefügten Dateien zu beeinflussen, damit git restore .einwandfrei funktioniert. Vielen Dank.
Saurabh Misra
3
Ich habe git restore <filename>es getan und es hat perfekt funktioniert.
Merlin
1
Hat gut für mich funktioniert.
Prometheus
1
Laut Manpage werden git restore .alle Dateien im aktuellen Verzeichnis wiederhergestellt, nicht im gesamten Repository.
jarno
1
Du hast recht. Vielen Dank! Ich habe es gerade getestet und tatsächlich ist das der Fall. Es ist jedoch rekursiv. Wenn es also vom Stammverzeichnis des Projekts ausgeführt wird, gilt es für das gesamte Repository. Ich werde meine Antwort bearbeiten.
Prosoitos
35

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

git add --all

Dann ich

git fetch --all

Dann setze ich auf Ursprung zurück

git reset --hard origin/branchname

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.

git reset --hard @{u}
Nick
quelle
Dies ist meine bevorzugte Option, aber warum fügen Sie zuerst alle Änderungen hinzu? Soweit mir bekannt ist, ändert dies nur die Verzeichnisliste in Git-Dateien, während git reset --hard verwendet wird. Dies geht trotzdem verloren, solange die Verzeichnisse noch entfernt werden.
XtrmJosh
Ich nicht auf Mac oder Linux, Github Windows Powershell lässt manchmal die Dateien dort nach dem Zurücksetzen. Ich denke, es liegt daran, dass Git Reset alle Dateien im Repo in den ursprünglichen Zustand versetzt. Wenn sie nicht hinzugefügt werden, werden sie nicht berührt. Der Desktop-Client wird dann das "Hey, diese Datei ist hier und muss festgeschrieben werden"
Nick
Sinn gemacht. Ich benutze Windows nicht, habe dieses Problem also nicht gesehen (habe Windows zumindest in den letzten Monaten nicht benutzt, erinnere mich nicht an viel vorher - es ist eine große bedauerliche Unschärfe). Könnte es wert sein, die
Gründe
Ich bin jetzt auch auf einem Mac auf dieses Problem gestoßen. Wenn die Datei im Repo nicht verfolgt wird, berührt Git Reset sie manchmal nicht. Ich kann das "WARUM" nicht wirklich isolieren, aber wenn das passiert, wenn ich zurücksetze und ich noch 1 oder zwei nicht festgeschriebene Dateien habe, füge ich --all hinzu und setze --hard wieder zurück
Nick
2
Eine nette kleine Variation davon, die ich mag, ist, git reset --hard @{u}die den Zweig
dorthin
31

Versuchte alle oben genannten Lösungen, konnte aber immer noch keine neuen, nicht bereitgestellten Dateien entfernen.

Verwenden Sie git clean -fdiese Option , um diese neuen Dateien zu entfernen - allerdings mit Vorsicht! Beachten Sie die Force-Option.

artur
quelle
21

einfach sagen

git stash

Es werden alle Ihre lokalen Änderungen entfernt. Sie können auch später verwenden, indem Sie sagen

git stash apply 

oder Git Stash Pop

piyushmandovra
quelle
21

Benutz einfach:

git stash -u

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:

git checkout -- .
git clean -df

Trotzdem gefällt mir git stash -udas am besten, weil es alle verfolgten und nicht verfolgten Änderungen in nur einem Befehl "verwirft" . Es werden jedoch git checkout -- .nur nachverfolgte Änderungen und git clean -dfnur nicht nachverfolgte Änderungen verworfen ... und das Eingeben beider Befehle ist viel zu viel Arbeit :)

Ben Wilde
quelle
Hinweis: git stash -uWird sich bald (Git 2.14.x / 2.15, Q3 2017) etwas weiterentwickeln: stackoverflow.com/a/46027357/6309
VonC
Wenn ich die Frage nach dem OP richtig bekomme, sollten die indizierten Dateien aufbewahrt werden. Nur Änderungen außerhalb der Bühne sollten entfernt werden. So sollte es git stash -kmeiner Meinung nach sein.
Snap
21

So machen Sie einen dauerhaften Rückwurf: git reset --hard

So speichern Sie Änderungen für später: git stash

SANGEETHA PH
quelle
16

Dies funktioniert sogar in Verzeichnissen, die sind; außerhalb der normalen Git-Berechtigungen.

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

Ist mir kürzlich passiert

GlassGhost
quelle
Beachten Sie jedoch, dass der Git-ignorierte Inhalt seine ursprünglichen Berechtigungen nicht beibehält! Daher kann es ein Sicherheitsrisiko verursachen.
zweimal
@twicejr Sie liegen falsch, lesen Sie bitte git help clean"-d Entfernen Sie nicht verfolgte Verzeichnisse zusätzlich zu nicht verfolgten Dateien."
GlassGhost
Warum haben Sie alle Ihre Dateien so eingestellt, dass sie weltweit gelesen / geschrieben werden? Keine gute Praxis.
Ghoti
@Ghoti mein schlechtes, 664 ist richtig? Sie können die Antwort auch gerne bearbeiten.
GlassGhost
Wenn Sie alle Berechtigungen auf 664 setzen, werden viele Annahmen darüber getroffen, welche Art von Berechtigungen das Projekt benötigt. Ich denke, dass die Verwendung dieses Teils des Befehls für einige Leute Probleme verursachen wird.
Ianrandmckenzie
15

Sie haben einen sehr einfachen Git-Befehl git checkout .

khem raj regmi
quelle
14
cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory
vivekporwal04
quelle
12

Meiner Meinung nach,

git clean -df

sollte den Trick machen. Laut Git-Dokumentation zu Git Clean

git-clean - Entfernen Sie nicht verfolgte Dateien aus dem Arbeitsbaum

Beschreibung

Bereinigt den Arbeitsbaum durch rekursives Entfernen von Dateien, die nicht der Versionskontrolle unterliegen, beginnend mit dem aktuellen Verzeichnis.

Normalerweise werden nur Dateien entfernt, die Git nicht bekannt sind. Wenn jedoch die Option -x angegeben ist, werden auch ignorierte Dateien entfernt. Dies kann beispielsweise nützlich sein, um alle Build-Produkte zu entfernen.

Wenn optionale ... Argumente angegeben werden, sind nur diese Pfade betroffen.

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 Option -f zweimal, wenn Sie ein solches Verzeichnis wirklich entfernen möchten.

-f --force Wenn die Git-Konfigurationsvariable clean.requireForce nicht auf false gesetzt ist, lehnt git clean die Ausführung ab, sofern nicht -f, -n oder -i angegeben wird.

Lahiru
quelle
11

Unabhängig davon, in welchem ​​Zustand sich Ihr Repo befindet, können Sie jederzeit auf ein vorheriges Commit zurücksetzen:

git reset --hard <commit hash>

Dadurch werden alle Änderungen verworfen, die nach diesem Commit vorgenommen wurden.

msangel
quelle
2
Dadurch wird auch alles im Index verworfen (nicht nur Dinge, die nicht im Index enthalten sind), was über das hinausgeht, was das OP verlangt.
Linus Arver
10

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.

tjb
quelle
9

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

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

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.

bbarker
quelle
7

Wenn Sie einen Vorrat an eine andere Person übertragen möchten:

# add files
git add .  
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes 
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff

[Bearbeiten] Wie kommentiert, ist es möglich, Verstecke zu benennen. Verwenden Sie dies, wenn Sie Ihren Vorrat teilen möchten;)

zweimal jr
quelle
5
Eigentlich kann Git Stash einen Titel haben. Zum Beispiel git stash save "Feature X work in progress".
Colin D Bennett
7

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

discard = checkout --

Dann können Sie es als nächstes verwenden, um alle Änderungen zu verwerfen:

discard .

Oder nur eine Datei:

discard filename

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

cleanout = !git clean -df && git checkout -- .

So ist die Verwendung wie folgt einfach:

cleanout

Jetzt ist es im nächsten Github-Repo verfügbar, das viele Aliase enthält:

Pau
quelle
7

Ich hatte eine seltsame Situation, in der eine Datei immer nicht bereitgestellt ist. Dies hilft mir bei der Lösung.

git rm .gitattributes
git add -A
git reset --hard

SDV
quelle