Frage Wie stelle ich alle lokalen Änderungen in Git-verwaltetem Projekt in den vorherigen Zustand zurück?


Ich habe ein Projekt, in dem ich lief git init. Nach mehreren Commits tat ich es git status Das hat mir gesagt, dass alles auf dem neuesten Stand ist und es keine lokalen Änderungen gab.

Dann machte ich mehrere aufeinanderfolgende Änderungen und erkannte, dass ich alles wegwerfen und in meinen ursprünglichen Zustand zurückkehren wollte. Wird dieser Befehl es für mich tun?

git reset --hard HEAD

1544
2017-07-18 07:52


Ursprung


Antworten:


Wenn Sie die an Ihrer Arbeitskopie vorgenommenen Änderungen rückgängig machen möchten, führen Sie Folgendes aus:

git checkout .

Wenn Sie Änderungen am Index rückgängig machen möchten (d. H., Die Sie hinzugefügt haben), führen Sie dies aus. Warnung, dies setzt alle Ihre nicht gedrückten Commits auf Master zurück!:

git reset

Wenn Sie eine von Ihnen vorgenommene Änderung rückgängig machen möchten, führen Sie Folgendes aus:

git revert <commit 1> <commit 2>

Wenn Sie nicht verfolgte Dateien entfernen möchten (z. B. neue Dateien, generierte Dateien):

git clean -f

Oder nicht verfolgte Verzeichnisse (z. B. neue oder automatisch generierte Verzeichnisse):

git clean -fd

2808
2017-07-18 07:57



Hinweis: Möglicherweise möchten Sie auch ausführen

git clean -fd

wie

git reset --hard

werden nicht Entfernen Sie nicht verfolgte Dateien, wobei git-clean alle Dateien aus dem überwachten Stammverzeichnis entfernt, die sich nicht im Git-Tracking befinden. WARNUNG - VORSICHT! Es ist hilfreich, zuerst einen Trockenlauf mit Git-Clean durchzuführen, um zu sehen, was gelöscht wird.

Dies ist auch besonders nützlich, wenn Sie die Fehlermeldung erhalten

~"performing this command will cause an un-tracked file to be overwritten"

Das kann passieren, wenn Sie mehrere Dinge tun, zum Beispiel eine Arbeitskopie aktualisieren, wenn Sie und Ihr Freund eine neue Datei mit dem gleichen Namen hinzugefügt haben, aber er hat sie zuerst in die Quellcodeverwaltung eingeordnet, und es ist Ihnen egal, Ihre nicht kopierte Kopie zu löschen .

In diesem Fall können Sie auch eine Liste mit Dateien anzeigen, die überschrieben werden.


334
2017-07-20 05:37



Wenn Sie alle Änderungen rückgängig machen UND mit dem aktuellen Remote-Master auf dem neuesten Stand sein möchten (z. B. wenn Sie feststellen, dass sich der Master-HEAD vorwärts bewegt hat, seit Sie ihn abgezweigt haben und Ihr Push "abgelehnt" wird)

git fetch  # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.

58
2018-04-22 20:48



Schau in git-reflog. Es wird alle Staaten auflisten, die es erinnert (Standard ist 30 Tage), und Sie können einfach die gewünschte Kasse auschecken. Beispielsweise:

$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d

47
2017-07-19 12:16



Re-klonen

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  •  Löscht lokale, nicht gepushte Commits
  •  Setzt Änderungen zurück, die Sie an verfolgten Dateien vorgenommen haben
  •  Stellt verfolgte Dateien, die Sie gelöscht haben, wieder her
  •  Löscht Dateien / Verzeichnisse, die in aufgelistet sind .gitignore (wie Builddateien)
  •  Löscht Dateien / Verzeichnisse, die nicht verfolgt werden und nicht in .gitignore
  •  Sie werden diesen Ansatz nicht vergessen
  •  Abfälle Bandbreite

Nachfolgend sind weitere Befehle, die ich täglich vergesse.

Reinigen und zurücksetzen

git clean -f -d -x
git reset --hard
  •  Löscht lokale, nicht gepushte Commits NICHT
  •  Setzt Änderungen zurück, die Sie an verfolgten Dateien vorgenommen haben
  •  Stellt verfolgte Dateien, die Sie gelöscht haben, wieder her
  •  Löscht Dateien / Verzeichnisse, die in aufgelistet sind .gitignore (wie Builddateien)
  •  Löscht Dateien / Verzeichnisse, die nicht verfolgt werden und nicht in .gitignore

Reinigen

git clean -f -d -x
  •  Löscht lokale, nicht gepushte Commits NICHT
  •  Kehrt KEINE Änderungen zurück, die Sie an verfolgten Dateien vorgenommen haben
  •  Stellt keine gelöschten Dateien wieder her
  •  Löscht Dateien / Verzeichnisse, die in aufgelistet sind .gitignore (wie Builddateien)
  •  Löscht Dateien / Verzeichnisse, die nicht verfolgt werden und nicht in .gitignore

Zurücksetzen

git reset --hard
  •  Löscht lokale, nicht gepushte Commits NICHT
  •  Setzt Änderungen zurück, die Sie an verfolgten Dateien vorgenommen haben
  •  Stellt verfolgte Dateien, die Sie gelöscht haben, wieder her
  •  Löscht Dateien / Verzeichnisse, die in aufgelistet sind .gitignore (wie Builddateien)
  •  Löscht KEINE Dateien / Verzeichnisse, die nicht verfolgt werden und nicht in .gitignore

Anmerkungen

Testfall zur Bestätigung aller oben genannten Punkte (bash oder sh verwenden):

mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
git add .
git commit -m 'Initial checkin'
echo 'NEW FEATURE' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo 'CODE' > 'd.sourceCode'

Siehe auch

  • git revert um neue Commits zu machen, die vorherige Commits rückgängig machen
  • git checkout um zu früheren Commits zurück zu gehen (eventuell müssen die obigen Befehle ausgeführt werden)
  • git stash gleich wie git reset oben, aber Sie können es rückgängig machen

40
2018-03-20 12:37



GEFAHR VOR: (Bitte lesen Sie die Kommentare. Das Ausführen des Befehls in meiner Antwort möglicherweise mehr als Sie wollen löschen)

um alle Dateien einschließlich der Verzeichnisse, die ich ausführen musste, vollständig zu entfernen

git clean -f -d

34
2017-09-11 07:10



Nachdem ich eine Reihe von Antworten gelesen und sie getestet habe, habe ich verschiedene Randfälle gefunden, die bedeuten, dass sie manchmal die Arbeitskopie nicht vollständig säubern.

Hier ist mein aktuelles Bash-Skript dafür, das die ganze Zeit funktioniert.

#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD

Führen Sie das Arbeitskopie-Stammverzeichnis aus.


34
2018-06-04 07:25



sag einfach

git stash

Es entfernt alle lokalen Chages. und Sie können später auch sagen

git stash apply 

29
2018-04-24 12:18



Ich habe ein ähnliches Problem gefunden. Die Lösung ist zu verwenden git log um nachzusehen, welche Version des lokalen Commits sich von der Remote unterscheidet. (Z. B. die Version ist 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Dann benutze git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec um die Änderung rückgängig zu machen.


26
2017-08-28 07:34



Sie möchten / wollen Ihre Arbeit / Dateien nicht unbedingt in Ihrem Arbeitsverzeichnis speichern, sondern müssen sie einfach vollständig entfernen. Der Befehl git clean werde das für dich tun.

Einige häufige Anwendungsfälle hierfür wären Entfernen Sie den Müll das wurde durch Zusammenführungen oder externe Tools erzeugt oder entfernt andere Dateien, so dass Sie einen sauberen Build ausführen können.

Beachten Sie, dass Sie diesen Befehl sehr vorsichtig ausführen müssen, da er Dateien aus Ihrem lokalen Arbeitsverzeichnis entfernen kann, die NICHT VERFOLGT sind. Wenn Sie nach dem Ausführen dieses Befehls Ihre Meinung ändern, können Sie den Inhalt der entfernten Dateien nicht mehr sehen. Eine Alternative, die sicherer ist, ist die Ausführung

git stash --all 

Das wird alles entfernen, aber alles in einem Versteck speichern. Dieser Versteck kann später verwendet werden.

Wenn Sie jedoch wirklich alle Dateien entfernen und Ihr Arbeitsverzeichnis bereinigen möchten, sollten Sie es ausführen

git clean -f -d

Dadurch werden alle Dateien und auch alle Unterverzeichnisse entfernt, die als Ergebnis des Befehls keine Elemente enthalten. Eine kluge Sache zu tun, bevor die git clean -f -d Befehl soll ausgeführt werden

git clean -f -d -n

was Ihnen eine Vorschau dessen zeigt, was nach der Ausführung entfernt wird git clean -f -d

Hier ist eine Zusammenfassung Ihrer Optionen von aggressiv bis am wenigsten aggressiv


Option 1: Entferne alle Dateien lokal (am aggressivsten)

git clean -f -d

Option 2: Vorschau der obigen Auswirkungen (Vorschau am aggressivsten)

git clean -f -d -n

Option 3: Speichern Sie alle Dateien (am wenigsten aggressiv)

`git stash --all` 

6
2018-06-14 22:31