git macht alle nicht festgeschriebenen oder nicht gespeicherten Änderungen rückgängig

834

Ich versuche, alle Änderungen seit meinem letzten Commit rückgängig zu machen. Ich habe es versucht git reset --hardund git reset --hard HEADnachdem ich diesen Beitrag gesehen habe . Ich antworte mit head ist jetzt bei 18c3773 ... aber wenn ich mir meine lokale Quelle ansehe, sind alle Dateien noch da. Was vermisse ich?

Antarr Byrd
quelle
1
Dies ist eine großartige Ressource direkt von Github: Wie man (fast) alles mit Git rückgängig macht
jasonleonhard
Leicht zu verstehen und einfach zu lesen: git-scm.com/book/en/v2/Git-Basics-Undoing-Things
MyTitle

Antworten:

1620
  • Dadurch werden alle Dateien entfernt, mit denen Sie möglicherweise Folgendes bereitgestellt haben git add:

    git reset
    
  • Dadurch werden alle lokalen nicht festgeschriebenen Änderungen zurückgesetzt (sollten im Repo-Stammverzeichnis ausgeführt werden):

    git checkout .
    

    Sie können nicht festgeschriebene Änderungen auch nur auf eine bestimmte Datei oder ein bestimmtes Verzeichnis zurücksetzen:

    git checkout [some_dir|file.txt]
    

    Eine weitere Möglichkeit, alle nicht festgeschriebenen Änderungen rückgängig zu machen (länger zu tippen, funktioniert jedoch in jedem Unterverzeichnis):

    git reset --hard HEAD
    
  • Dadurch werden alle lokalen nicht verfolgten Dateien entfernt, sodass nur noch git-verfolgte Dateien übrig bleiben:

    git clean -fdx
    

    WARNUNG: -x Entfernt auch alle ignorierten Dateien, einschließlich der von .gitignore! Möglicherweise möchten Sie eine -nVorschau der zu löschenden Dateien verwenden.


Um es zusammenzufassen: Das Ausführen der folgenden Befehle entspricht im Wesentlichen dem Frisch git cloneaus der Originalquelle (aber es wird nichts erneut heruntergeladen, ist also viel schneller):

git reset
git checkout .
git clean -fdx

Eine typische Verwendung hierfür ist das Erstellen von Skripten, wenn Sie sicherstellen müssen, dass Ihr Baum absolut sauber ist - keine Änderungen oder lokal erstellten Objektdateien oder Build-Artefakte enthält und Sie möchten, dass er sehr schnell funktioniert und nicht erneut funktioniert Klonen Sie jedes Mal das gesamte Repository.

mvp
quelle
@ Turibe das ist richtig. Ich musste mein Projekt mehrmals starten, da alle heruntergeladenen Abhängigkeiten und mein .idea-Ordner entfernt wurden. Benötigen Sie eine bessere Lösung.
EresDev
2
@EresDev, Sie müssen nicht ausführen git clean, es werden nicht festgeschriebene Änderungen rückgängig gemacht, aber alle nicht verfolgten oder hinzugefügten Dateien bleiben erhalten. Dies kann sich jedoch auf das Build-Ergebnis auswirken, da einige nicht verfolgte Dateien möglicherweise stören. Was ist beispielsweise, wenn Ihr .idea-Verzeichnis beschädigt wurde?
MVP
git resetsagt mir, ich habe Änderungen, die ich speichern muss
Daniel Springer
1
Laufen git clean -fdxmeine gelöscht node_modulesund .env, groß
fires3as0n
1
@fire3as0n Was hast du noch erwartet? Das musste passieren. Die Antwort enthält auch eine Warnung.
Rishav
148

Wenn Sie alle nicht festgeschriebenen Änderungen " rückgängig machen " möchten, führen Sie einfach Folgendes aus:

git stash
git stash drop

Wenn Sie nicht verfolgte Dateien haben (durch Ausführen überprüfen git status), können diese durch Ausführen entfernt werden:

git clean -fdx

git stashErstellt einen neuen Stash, der zu Stash @ {0} wird . Wenn Sie zuerst überprüfen möchten, können Sie git stash listeine Liste Ihrer Verstecke anzeigen. Es wird ungefähr so ​​aussehen:

stash@{0}: WIP on rails-4: 66c8407 remove forem residuals
stash@{1}: WIP on master: 2b8f269 Map qualifications
stash@{2}: WIP on master: 27a7e54 Use non-dynamic finders
stash@{3}: WIP on blogit: c9bd270 some changes

Jeder Stash ist nach der vorherigen Commit-Nachricht benannt.

Abram
quelle
2
Eine gute Lösung in der Tat, aber Sie müssen Änderungen mit git add .vorher inszenieren, git stashweil es mir auch nachgit stash
EresDev
21

Es gibt auch git stash- was Ihre lokalen Änderungen "versteckt" und zu einem späteren Zeitpunkt erneut angewendet oder gelöscht werden kann, wenn dies nicht mehr erforderlich ist

Weitere Infos zum Verstauen

keshav
quelle
12

Ich verwende den Quellbaum .... Sie können alle nicht festgeschriebenen Änderungen in zwei einfachen Schritten rückgängig machen:

1) Sie müssen nur den Status der Arbeitsbereichsdatei zurücksetzen

Geben Sie hier die Bildbeschreibung ein 2) Wählen Sie alle Unstage-Dateien aus (Befehl + a), klicken Sie mit der rechten Maustaste und wählen Sie Entfernen

Geben Sie hier die Bildbeschreibung ein

So einfach ist das: D.

user1872384
quelle
Wenn Sie den zurückgesetzten Zweig zurücksetzen und dann den Zweig wechseln und neu aufbauen, tut dies weh. Das Zurücksetzen ist nützlich, sollte jedoch nicht zum Löschen nicht festgeschriebener Änderungen verwendet werden. Wenn Sie nicht festgeschriebene Änderungen löschen, verstauen Sie sie einfach und löschen Sie sie.
Dinu Nicolae
10

Was ich tue ist

git add . (adding everything)
git stash 
git stash drop

Einzeiler: git add . && git stash && git stash drop

Ralph
quelle
Dies ist das Beste
Madrugada
7

Für diejenigen, die hier angekommen sind und gesucht haben, ob sie rückgängig machen können git clean -f -d, wodurch eine in Eclipse erstellte Datei gelöscht wurde,

Sie können dasselbe über die Benutzeroberfläche tun, indem Sie "Aus lokalem Verlauf wiederherstellen" für ref: Aus lokalem Verlauf wiederherstellen

Abdul Rahman K.
quelle
3
Ich habe nicht abgestimmt, aber Ihre Antwort auf Ihre Absicht ist weniger als klar. Es wäre hilfreich, wenn Sie den ersten Satz in der Antwort umformulieren würden.
Mark Schultheiss
5

Staaten, die von einem Commit zu einem neuen Commit übergehen

0. last commit,i.e. HEAD commit
1. Working tree changes, file/directory deletion,adding,modification.
2. The changes are staged in index
3. Staged changes are committed

Aktion für den Zustandsübergang

0->1: manual file/directory operation
1->2: git add .
2->3: git commit -m "xxx"

Diff prüfen

0->1: git diff
0->2: git diff --cached
0->1, and 0->2: git diff HEAD
last last commit->last commit: git diff HEAD^ HEAD

Zum letzten Commit zurückkehren

2->1: git reset
1->0: git checkout .     #only for tracked files/directories(actions include modifying/deleting tracked files/directories)
1->0: git clean -fdx     #only for untracked files/directories(action includes adding new files/directories)
2->1, and 1->0: git reset --hard HEAD

Entspricht dem Git-Klon, ohne etwas erneut herunterzuladen

git reset && git checkout . && git clean -fdx
Zii
quelle
Ich sehe nicht, wie dies mit der gestellten Frage zusammenhängt. Dies ist nur eine Reihe von seltsamen Rezepten ohne wirkliche Substanz.
MVP