Frage

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

War es hilfreich?

Lösung

Eine andere schnellere Möglichkeit ist:

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

Sie müssen nicht einschließen --include-untracked wenn Sie nicht gründlich darauf eingehen möchten.

Danach können Sie diesen Vorrat mit a löschen git stash drop Befehl, wenn Sie möchten.

Andere Tipps

Für alle nicht bereitgestellten Dateien im aktuellen Arbeitsverzeichnis verwenden Sie:

git checkout -- .

Für eine bestimmte Datei verwenden Sie:

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

-- hier zum entfernen Argument-Mehrdeutigkeit.

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

git clean -df
git checkout -- .

git clean Entfernt alle nicht verfolgten Dateien (Warnung:ignorierte Dateien, die direkt in .gitignore erwähnt werden, werden zwar nicht gelöscht, Möglicherweise werden ignorierte Dateien in Ordnern gelöscht) Und git checkout löscht alle nicht bereitgestellten Änderungen.

Dadurch wird der aktuelle Index für das aktuelle Verzeichnis ausgecheckt und alle Änderungen an Dateien ab dem aktuellen Verzeichnis verworfen.

git checkout .

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

git checkout-index -a -f
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:Gewalt (je nach Situation möglicherweise nicht erforderlich). clean.requireForce Einstellung)

Laufen git help clean um das Handbuch zu sehen

Mein Liebling ist

git checkout -p

Dadurch können Sie Chunks selektiv zurücksetzen.

Siehe auch:

git add -p

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

git clean -dfx
git checkout .

Dies ist der Online-Hilfetext für das verwendete 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 -f Option zweimal, wenn Sie ein solches Verzeichnis wirklich entfernen möchten.

-f

Wenn die Git-Konfigurationsvariable clean.requireForce ist nicht eingestellt false, verweigert Git Clean das Löschen von Dateien oder Verzeichnissen, sofern dies nicht angegeben ist -f, -n, oder -i.Git weigert sich, Verzeichnisse innerhalb des zu löschen .git Unterverzeichnis oder Datei, es sei denn, ein zweites -f gegeben ist.

-x

Verwenden Sie nicht die Ignorierregeln von .gitignore (pro Verzeichnis) und $GIT_DIR/info/exclude, aber verwenden Sie weiterhin die Ignorierregeln, die mit angegeben sind -e Optionen.Dies ermöglicht das Entfernen aller nicht verfolgten Dateien, einschließlich Build-Produkten.Dies kann (ggf. in Verbindung mit) verwendet werden git reset), um ein makelloses Arbeitsverzeichnis zu erstellen, um einen sauberen Build zu testen.

Auch, git checkout . muss im Stammverzeichnis des Repos erfolgen.

Ich fand diesen Artikel wirklich hilfreich, um zu erklären, wann welcher Befehl verwendet werden sollte: 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, damit sie mit der Version im Index übereinstimmen“.Wenn die Dateien nicht bereitgestellt (d. h. zum Index hinzugefügt) wurden ...Mit diesem Befehl werden die Dateien im Wesentlichen auf den Stand Ihres letzten Commits zurückgesetzt.

    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 es verwendet wird git stash ist eine beliebte Wahl, da es etwas weniger gefährlich ist.Sie können jederzeit darauf zurückgreifen, wenn Sie bei der Verwendung von Git Reset versehentlich zu viel wegblasen.Zurücksetzen ist standardmäßig rekursiv.

Weitere Ratschläge finden Sie im obigen Artikel.

Am einfachsten geht das mit diesem Befehl:

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

git checkout -- .

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

Im Git-Befehl wird das Stashen nicht verfolgter Dateien durch Folgendes erreicht:

git stash -u

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

Wenn Sie es nur wünschen um Änderungen an vorhandenen Dateien zu entfernen, verwenden 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 und dass Sie die Angabe eines Zweigs übersprungen haben.
  • Die Periode (.) gibt alle Pfade an.

Falls Sie es wollen um hinzugefügte Dateien zu entfernen Verwenden Sie seit Ihrem letzten Commit clean (hier dokumentiert):

git clean -i 
  • Der -i Die Option initiiert eine interaktive Aktion clean, um versehentliches Löschen zu verhindern.
  • Für eine schnellere Ausführung stehen eine Handvoll weiterer Optionen zur Verfügung;siehe Dokumentation.

Wenn Sie wünschen um Änderungen für den späteren Zugriff in einen Speicherbereich zu verschieben, verwenden stash (hier dokumentiert):

git stash
  • Alle Änderungen werden für einen möglichen späteren Zugriff in Git's Stash verschoben.
  • Für eine differenziertere Aufbewahrung stehen eine Handvoll Optionen zur Verfügung.siehe Dokumentation.

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

git diff | git apply --reverse

Während Sie Git Status eingeben,(verwenden Sie „git checkout -- …“, um Änderungen im Arbeitsverzeichnis zu verwerfen)wird gezeigt.

z.B. git checkout -- .

git checkout -f


man git-checkout:

-f, --force

Fahren Sie beim Wechseln der Zweige auch dann fort, wenn der Index oder der Arbeitsbaum von HEAD abweicht.Dies wird verwendet, um lokale Änderungen zu verwerfen.

Scheitern Sie beim Auschecken von Pfaden aus dem Index nicht an nicht zusammengeführten Einträgen.Stattdessen werden nicht zusammengeführte Einträge ignoriert.

Sie können Git Stash verwenden – wenn etwas schief geht, können Sie immer noch vom 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 git clean Hat bei mir auch funktioniert, aber mit dem Stash habe ich mehr Kontrolle – wenn ich versehentlich etwas mache, kann ich meine Änderungen immer noch zurückbekommen

AKTUALISIEREN

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

git add . -A anstatt git add .

ohne das -A Die entfernten Dateien werden nicht bereitgestellt

Anstatt die Änderungen zu verwerfen, habe ich meine Fernbedienung auf den Ursprung zurückgesetzt.Hinweis: Mit dieser Methode stellen Sie Ihren Ordner vollständig auf den des Repos zurück.

Also mache ich das, um sicherzustellen, dass sie nicht dort bleiben, wenn ich Git zurücksetze (später – schließt Gitignores auf dem Ursprung/Zweignamen aus)

NOTIZ:Wenn Sie Dateien behalten möchten, die noch nicht verfolgt wurden, aber nicht in GITIGNORE, können Sie diesen Schritt überspringen, da dadurch 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 habe ich auf den Ursprung zurückgesetzt

git reset --hard origin/branchname

Das wird es wieder auf den Punkt bringen.Genau wie das erneute Klonen des Zweigs, während alle meine gitignorierten Dateien lokal und an Ort und Stelle bleiben.

Aktualisiert pro Benutzerkommentar unten:Variante zum Zurücksetzen auf den aktuellen Zweig, in dem sich der Benutzer befindet.

git reset --hard @{u}

Habe alle oben genannten Lösungen ausprobiert, konnte aber die neuen, nicht bereitgestellten Dateien immer noch nicht entfernen.

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

einfach sagen

git stash

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

git stash apply 

oder Git Stash Pop

Benutz einfach:

git stash -u

Erledigt.Einfach.

Wenn du Wirklich Kümmere dich um deinen Vorratsstapel, dann kannst du weitermachen git stash drop.Aber an diesem Punkt ist es besser, (von Mariusz Nowak) zu verwenden:

git checkout -- .
git clean -df

Trotzdem gefällt es mir git stash -u Das Beste daran ist, dass alle verfolgten und nicht verfolgten Änderungen sofort „verworfen“ werden ein Befehl.Noch git checkout -- . Nur verfolgt Veränderungen und verfolgte Veränderungen und git clean -df Verwirft nur nicht verfolgte Änderungen ...und das Eingeben beider Befehle ist weit zu viel Arbeit :)

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

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

Ist mir kürzlich passiert

cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory

Ganz gleich, in welchem ​​Zustand sich Ihr Repo befindet, Sie können jederzeit auf jedes vorherige Commit zurücksetzen:

git reset --hard <commit hash>

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

Eine andere Möglichkeit, neue Dateien zu entfernen, die spezifischer ist als git clean -df (damit können Sie einige Dateien entfernen, nicht unbedingt alle), besteht darin, die neuen Dateien zuerst zum Index hinzuzufügen, sie dann zu speichern und dann zu löschen verstauen.

Diese Technik ist nützlich, wenn Sie aus irgendeinem Grund nicht alle nicht verfolgten Dateien mit einem gewöhnlichen Mechanismus (wie rm) einfach löschen können.

Meiner Meinung nach,

git clean -df

sollte den Zweck erfüllen.Gemäß Git-Dokumentation zu Git Clean

git-clean – Nicht verfolgte Dateien aus dem Arbeitsbaum entfernen

Beschreibung

Reinigt den Arbeitsbaum durch rekursives Entfernen von Dateien, die nicht unter Versionskontrolle stehen, ab dem aktuellen Verzeichnis.

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

Falls optional ...Es werden Argumente angegeben, nur diese Pfade sind betroffen.

Optionen

-d Entfernt nicht verfolgte Verzeichnisse zusätzlich zu nicht verfolgten Dateien.Wenn ein nicht zusammenes 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 festgelegt ist, wehte es Git Clean ab, auszuführen, es sei denn, das angegeben -f, -n oder -i.

Was folgt, ist wirklich nur dann eine Lösung, wenn Sie mit einem Zweig eines Repositorys arbeiten, in dem Sie regelmäßig synchronisieren (z. B.Pull-Anfrage) mit einem anderen Repo.Kurze Antwort:Fork und Refork löschen, aber Lesen Sie die Warnungen auf Github.

Ich hatte ein ähnliches, vielleicht nicht identisches Problem, und ich muss leider sagen, dass meine Lösung nicht ideal, aber letztendlich effektiv ist.

Ich hatte oft Git-Statusmeldungen wie diese (die mindestens 2/4 Dateien betrafen):

$ 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 Doppelgänger enthalten, die aus einem einzelnen Buchstaben bestehen, sofern die Groß-/Kleinschreibung nicht angezeigt wird.Irgendwie, und ich habe keine Ahnung, was mich überhaupt auf diesen Weg geführt hat (da ich selbst nicht mit diesen Dateien aus dem Upstream-Repo gearbeitet habe), hatte ich diese Dateien gewechselt.Probieren Sie die vielen Lösungen aus, die auf dieser Seite (und anderen Seiten) aufgeführt sind. Sie scheinen jedoch nicht geholfen zu haben.

Ich konnte das Problem beheben, indem ich mein geforktes Repository und alle lokalen Repositorys löschte und eine neue Aufspaltung durchführte.Dies allein reichte nicht aus;Upstream musste die betreffenden Dateien in neue Dateinamen umbenennen. Solange Sie keine nicht festgeschriebene Arbeit, keine Wikis und keine Probleme haben, die vom Upstream-Repository abweichen, sollte alles in Ordnung sein.Upstream ist, gelinde gesagt, möglicherweise nicht sehr zufrieden mit Ihnen.Was mein Problem betrifft, handelt es sich zweifellos um einen Benutzerfehler, da ich mich mit Git nicht so gut auskenne, aber die Tatsache, dass es alles andere als einfach ist, es zu beheben, deutet ebenfalls auf ein Problem mit Git hin.

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 bereits erwähnt, ist es möglich, Stashes zu benennen.Nun, nutzen Sie dies, wenn Sie Ihren Vorrat teilen möchten ;)

Sie könnten Ihren eigenen Alias ​​erstellen, der die Vorgehensweise auf anschauliche Weise beschreibt.

Ich verwende den nächsten Alias, um Änderungen zu verwerfen.


Änderungen in einer (Liste von) Dateien im Arbeitsbaum verwerfen

discard = checkout --

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

discard .

Oder einfach eine Datei:

discard filename

Ansonsten, wenn Sie alle Änderungen und auch die nicht verfolgten Dateien verwerfen möchten, verwende ich eine Mischung aus Auschecken und Bereinigen:

Bereinigen und verwerfen Sie Änderungen und nicht verfolgte Dateien im Arbeitsbaum

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

Die Verwendung ist also wie folgt einfach:

cleanout

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

Wenn alle bereitgestellten Dateien tatsächlich festgeschrieben wurden, kann der Zweig einfach zurückgesetzt werden, z. B.von Ihrer GUI aus mit etwa drei Mausklicks: Zweig, Zurücksetzen, Ja!

Was ich in der Praxis oft mache, um unerwünschte lokale Änderungen rückgängig zu machen, ist, alle guten Dinge festzuschreiben und dann den Zweig zurückzusetzen.

Wenn die guten Inhalte in einem einzigen Commit festgeschrieben werden, können Sie „Letzten Commit ändern“ verwenden, um ihn wieder in den Staging-Zustand zu versetzen oder ihn wieder aufzuheben, wenn Sie ihn letztendlich etwas anders festschreiben möchten.

Dies ist vielleicht nicht die technische Lösung, die Sie für Ihr Problem suchen, aber ich finde, dass es eine sehr praktische Lösung ist.Es ermöglicht Ihnen, nicht bereitgestellte Änderungen selektiv zu verwerfen, die Änderungen, die Ihnen nicht gefallen, zurückzusetzen und die Änderungen beizubehalten, die Sie vorgenommen haben.

Zusammenfassend lässt sich sagen, dass ich es einfach tue begehen, Zweig zurückgesetzt, Und Letztes Commit ändern.

Wenn Sie ein Submodul haben und keine anderen Lösungen funktionieren, versuchen Sie Folgendes:

  • Um zu überprüfen, was das Problem ist (vielleicht ein „schmutziger“ Fall), verwenden Sie:

    git diff

  • Um den Vorrat zu entfernen

    git submodule update

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

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

Wenn es fast unmöglich ist, Änderungen an den Dateien auszuschließen, haben Sie darüber nachgedacht, sie zu ignorieren?Wenn diese Aussage richtig ist und Sie diese Dateien während Ihrer Entwicklung nicht berühren würden, könnte dieser Befehl nützlich sein:

git update-index --assume-unchanged file_to_ignore

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top