zurücksetzen - Wie verwerfe ich nicht bereitgestellte Änderungen in Git?




git stash (20)

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 Ablegen nicht aufgespürter Dateien durch Folgendes erreicht:

git stash -u

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

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


Anstatt die Änderungen zu verwerfen, setze ich meine Fernbedienung auf den Ursprung zurück. Hinweis - Mit dieser Methode wird der Ordner vollständig im Repo wiederhergestellt.

Also mache ich das, um sicherzustellen, dass sie nicht dort sitzen, wenn ich git reset (später - ausgenommen gitignores für den Herkunfts- / Zweignamen).

ANMERKUNG: Wenn Sie möchten, dass Dateien noch nicht verfolgt werden, aber nicht in GITIGNORE, sollten Sie diesen Schritt überspringen, da diese nicht gespeicherten 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 mich 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.

Nachstehend aktualisierter Benutzerkommentar: Variation, um den aktuellen Zweig des Benutzers zurückzusetzen.

git reset --hard @{u}

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

git clean -dfx
git checkout .

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

-d

Entfernen Sie nicht protokollierte Verzeichnisse zusätzlich zu nicht protokollierten Dateien. Wenn ein nicht protokolliertes 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

Wenn die Git-Konfigurationsvariable clean.requireForce nicht auf false , clean.requireForce Git clean das Löschen von Dateien oder Verzeichnissen ab, sofern -f , -n oder -i nicht angegeben ist. Git weigert sich, Verzeichnisse im .git Unterverzeichnis oder in der Datei zu löschen, sofern nicht ein zweites -f angegeben wird.

-x

Verwenden Sie nicht die Ignorierregeln aus .gitignore (pro Verzeichnis) und $GIT_DIR/info/exclude , sondern verwenden Sie immer noch die mit den -e Optionen angegebenen Ignorierregeln. Dies ermöglicht das Entfernen aller nicht protokollierten Dateien, einschließlich der Build-Produkte. Dies kann (möglicherweise in Verbindung mit git reset ) verwendet werden, um ein sauberes Arbeitsverzeichnis zum Testen eines sauberen git reset zu erstellen.

Auch git checkout . muss in der Wurzel des Repos erfolgen.


Dadurch wird der aktuelle Index für das aktuelle Verzeichnis ausgecheckt, und alle Änderungen in den Dateien werden 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

Egal in welchem ​​Zustand sich Ihr Repo befindet, Sie können jederzeit auf ein früheres Commit zurücksetzen:

git reset --hard <commit hash>

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


Ein anderer schneller Weg ist:

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

Sie müssen --include-untracked nicht --include-untracked wenn Sie nicht gründlich darüber --include-untracked möchten.

Danach können Sie diesen Stash mit einem git stash drop Befehl git stash drop wenn Sie möchten.


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

git clean -df
git checkout -- .

git-scm.com/docs/git-clean entfernt alle nicht zurückverfolgten Dateien ( Warnung : Obwohl ignorierte Dateien, die direkt in .gitignore erwähnt werden, nicht gelöscht werden, werden möglicherweise ignorierte Dateien in Ordnern gelöscht ) und git checkout löscht alle nicht bereitgestellten Änderungen.


Für alle nicht bereitgestellten Dateien verwenden Sie:

git checkout -- .

Für eine bestimmte Datei verwenden Sie:

git checkout path/to/file/to/revert

Stellen Sie sicher, dass Sie die Periode am Ende angeben.


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

Verwenden Sie git clean -f , um diese neuen Dateien zu entfernen - mit Vorsicht! Beachten Sie die Kraftoption.


Keine der Lösungen funktioniert, wenn Sie gerade die Berechtigungen einer Datei geändert haben (dies ist unter DOS / Windoze)

Mon 23/11/2015-15:16:34.80 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:16:37.87 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

Mon 23/11/2015-15:16:45.22 C:\...\work\checkout\slf4j+> git reset --hard HEAD
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:16:47.42 C:\...\work\checkout\slf4j+> git clean -f

Mon 23/11/2015-15:16:53.49 C:\...\work\checkout\slf4j+> git stash save -u
Saved working directory and index state WIP on SLF4J_1.5.3: 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:17:00.40 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/[email protected]{0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd)

Mon 23/11/2015-15:17:06.75 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/[email protected]{0} (e6c49c470f433ce344e305c5b778e810625d0529)

Mon 23/11/2015-15:17:08.90 C:\...\work\checkout\slf4j+> git stash drop
No stash found.

Mon 23/11/2015-15:17:15.21 C:\...\work\checkout\slf4j+> git checkout -- .

Mon 23/11/2015-15:22:00.68 C:\...\work\checkout\slf4j+> git checkout -f -- .

Mon 23/11/2015-15:22:04.53 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:22:13.06 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

Sie können dies nur beheben, indem Sie die Berechtigungen für die geänderten Dateien manuell zurücksetzen:

Mon 23/11/2015-15:25:43.79 C:\...\work\checkout\slf4j+> git status -s | egrep "^ M" | cut -c4- | for /f "usebackq tokens=* delims=" %A in (`more`) do chmod 644 %~A

Mon 23/11/2015-15:25:55.37 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
nothing to commit, working directory clean

Mon 23/11/2015-15:25:59.28 C:\...\work\checkout\slf4j+>

Mon 23/11/2015-15:26:31.12 C:\...\work\checkout\slf4j+> git diff


Meiner Meinung nach,

git clean -df

sollte den Trick tun. Wie in der Git-Dokumentation zu Git Clean

git-clean - Entfernt nicht nachverfolgte Dateien aus dem Arbeitsbaum

Beschreibung

Bereinigt die Arbeitsstruktur, indem Dateien, die nicht der Versionskontrolle unterliegen, rekursiv entfernt werden, beginnend mit dem aktuellen Verzeichnis.

Normalerweise werden nur für Git unbekannte Dateien entfernt. Wenn jedoch die Option -x angegeben wird, werden auch ignorierte Dateien entfernt. Dies kann zum Beispiel nützlich sein, um alle Build-Produkte zu entfernen.

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

Optionen

-d Entfernt nicht verfolgte Verzeichnisse zusätzlich zu nicht erfassten Dateien. Wenn ein nicht protokolliertes 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, es sei denn, -f, -n oder -i.


Sie können Git Stash verwenden - wenn etwas schief geht, können Sie immer noch aus dem Stash zurückkehren. Ähnlich wie hier bei einer anderen Antwort, aber diese entfernt auch alle nicht gespeicherten Dateien und auch alle nicht gespeicherten Löschungen:

git add .
git stash

Wenn Sie sich vergewissern, dass alles in Ordnung ist, werfen Sie den Vorrat weg:

git stash drop

Die Antwort von Bilal Maqsood mit git clean funktionierte auch für mich, aber mit dem Versteck habe ich mehr Kontrolle - wenn ich etwas versehentlich mache, kann ich meine Änderungen trotzdem zurückbekommen

AKTUALISIEREN

Ich denke, es gibt noch eine weitere Änderung (weiß nicht, warum das früher für mich funktioniert hat):

git add . -A git add . -A statt git add .

Ohne das -A die entfernten Dateien nicht bereitgestellt


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

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

Ich hätte oft git Statusmeldungen wie diese (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 feststellen, dass diese Dateien Doppelgänger haben, die im Einzelfall ein einziger Buchstabe sind. Irgendwie, und ich habe keine Ahnung, was mich anfangs auf diesen Weg gebracht hat (da ich selbst nicht mit diesen Dateien vom Upstream-Repo gearbeitet habe), hatte ich diese Dateien gewechselt. Versuchen Sie, die vielen Lösungen, die auf dieser Seite (und anderen Seiten) aufgelistet sind, nicht zu helfen.

Ich konnte das Problem beheben, indem ich mein gegabeltes Repository und alle lokalen Repositorys löschte und neu forschte. Dies allein war nicht genug; upstream musste die betreffenden Dateien in neue Dateinamen umbenennen. Solange Sie keine uneingeschränkte Arbeit haben, keine Wikis und keine Probleme, die vom vorgelagerten Repository abweichen, sollten Sie in Ordnung sein. Upstream kann mit Ihnen nicht sehr glücklich sein, um es gelinde auszudrücken. Mein Problem ist zweifellos ein Benutzerfehler, da ich mit git nicht so gut vertraut bin. Die Tatsache, dass es bei weitem nicht einfach ist, das Problem zu beheben, weist 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

[edit] Wie bereits erwähnt, können Stashes benannt werden. Nun, verwenden Sie dies, wenn Sie Ihre Vorräte teilen möchten;)


Wenn Sie nicht daran interessiert sind, die nicht bereitgestellten Änderungen beizubehalten (insbesondere wenn die bereitgestellten Änderungen neue Dateien sind), habe ich Folgendes gefunden:

git diff | git apply --reverse

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

Was ich in der Praxis oft tue, um unerwünschte lokale Änderungen rückgängig zu machen, ist das Festschreiben aller guten Sachen und das Zurücksetzen des Zweigs.

Wenn das Gute in einem einzigen Commit festgeschrieben wird, können Sie mit "letzter Commit ändern" wieder inszeniert werden, wenn Sie es letztendlich etwas anders festlegen möchten.

Dies ist möglicherweise nicht die technische Lösung, die Sie für Ihr Problem suchen, aber ich finde es eine sehr praktische Lösung. Sie können nicht gespeicherte Änderungen selektiv verwerfen, die Änderungen zurücksetzen, die Ihnen nicht gefallen, und die Änderungen beibehalten.

Zusammenfassend füge ich einfach fest, lösche die Verzweigung und ändere das letzte Commit .


git checkout -f

man git-checkout :

-f, --force

Gehen Sie beim Wechseln der Verzweigungen auch dann vor, wenn der Index oder der Arbeitsbaum von HEAD abweicht. Hiermit werden lokale Änderungen verworfen.

Beim Auschecken von Pfaden aus dem Index nicht bei nicht zusammengeführten Einträgen fehlschlagen. Stattdessen werden nicht zusammengeführte Einträge ignoriert.


Ich hatte eine seltsame Situation, in der eine Datei immer unstaged ist. Dies hilft mir bei der Auflösung.

git rm .gitattributes
git hinzufügen -A
git reset --hard


Wenn Sie sich im Falle eines Submoduls befinden und keine anderen Lösungen funktionieren, versuchen Sie Folgendes:

  • Um herauszufinden, was das Problem ist (möglicherweise ein "schmutziger" Fall), verwenden Sie:

    git diff

  • Versteck entfernen

    git submodule update


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




git