2575 Stimmen

Wie kann ich alle lokalen Änderungen in einem mit Git verwalteten Projekt auf den vorherigen Zustand zurücksetzen?

Ich habe ein Projekt, bei dem ich die git init . Nach mehreren Übertragungen, habe ich git status die mir mitteilte, dass alles auf dem neuesten Stand sei und es keine lokalen Änderungen gäbe.

Dann habe ich mehrere aufeinanderfolgende Änderungen vorgenommen und festgestellt, dass ich alles wegwerfen und zu meinem ursprünglichen Zustand zurückkehren möchte. Wird dieser Befehl das für mich tun?

git reset --hard HEAD

4490voto

1800 INFORMATION Punkte 125009

Wenn Sie Änderungen an Ihrer Arbeitskopie rückgängig machen wollen, tun Sie dies:

git checkout .

Oder äquivalent, für Git-Version >= 2.23:

git restore .

Wenn Sie Änderungen am Index rückgängig machen wollen (d.h. Änderungen, die Sie hinzugefügt haben), gehen Sie folgendermaßen vor. Achtung, dies setzt alle Ihre nicht gepushten Commits auf Master zurück! :

git reset

Wenn Sie eine bereits vorgenommene Änderung rückgängig machen wollen, gehen Sie wie folgt vor:

git revert <commit 1> <commit 2>

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

git clean -f

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

git clean -fd

163 Stimmen

Fwiw nach einer so langen Zeit, git checkout path/to/file macht nur die lokalen Änderungen an path/to/file

34 Stimmen

+1 zu den Antworten unten, in denen auch git clean -f (um die nicht verfolgten Änderungen zu entfernen) und -fd (um auch nicht verfolgte Verzeichnisse zu entfernen) erwähnt werden

0 Stimmen

Mit dem Git-Befehl "git checkout branchId" werden zwar die geänderten Dateien aufgelistet, aber es wird kein Revert durchgeführt. Ich muss git reset --hard verwenden

495voto

Antony Stubbs Punkte 12453

Hinweis: Sie können auch Folgendes ausführen

git clean -fd

als

git reset --hard

wird no entfernt nicht verfolgte Dateien, während git-clean alle Dateien aus dem Root-Verzeichnis entfernt, die nicht unter Git-Tracking stehen. WARNUNG - SEIEN SIE VORSICHTIG! Es ist hilfreich, zuerst einen Probelauf 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"

Eine davon ist die Aktualisierung einer Arbeitskopie, wenn Sie und Ihr Freund eine neue Datei mit demselben Namen hinzugefügt haben, aber er sie zuerst in die Versionsverwaltung übertragen hat und Sie sich nicht darum kümmern, Ihre nicht verfolgte Kopie zu löschen.

In diesem Fall hilft ein Probelauf, um eine Liste der Dateien zu erstellen, die überschrieben werden sollen.

13 Stimmen

Der Befehl zur Dateibereinigung lautet "git clean -f". Nicht getrackte Verzeichnisse werden mit "git clean -d" entfernt.

35 Stimmen

Git clean -fd (force ist für -d erforderlich)

21 Stimmen

-n oder --dry-run sind die Flaggen für den Trockenlauf.

277voto

William Entriken Punkte 33360

Neu klonen

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  • Löscht lokale, nicht gepushte Commits
  • Macht Änderungen, die Sie an verfolgten Dateien vorgenommen haben, rückgängig
  • Stellt gelöschte, verfolgte Dateien wieder her
  • Löscht die Dateien/Verzeichnisse, die in .gitignore (wie Build-Dateien)
  • Löscht Dateien/Verzeichnisse, die nicht verfolgt werden und nicht in .gitignore
  • Diesen Ansatz werden Sie nicht vergessen
  • Vergeudet Bandbreite

Es folgen weitere Befehle, die ich täglich vergesse.

Reinigen und zurücksetzen

git clean --force -d -x
git reset --hard
  • Löscht lokale, nicht gepushte Commits
  • Macht Änderungen, die Sie an verfolgten Dateien vorgenommen haben, rückgängig
  • Stellt gelöschte, verfolgte Dateien wieder her
  • Löscht die Dateien/Verzeichnisse, die in .gitignore (wie Build-Dateien)
  • Löscht Dateien/Verzeichnisse, die nicht verfolgt werden und nicht in .gitignore

Sauber

git clean --force -d -x
  • Löscht lokale, nicht gepushte Commits
  • Macht Änderungen, die Sie an verfolgten Dateien vorgenommen haben, rückgängig
  • Stellt gelöschte, verfolgte Dateien wieder her
  • Löscht die Dateien/Verzeichnisse, die in .gitignore (wie Build-Dateien)
  • Löscht Dateien/Verzeichnisse, die nicht verfolgt werden und nicht in .gitignore

Zurücksetzen

git reset --hard
  • Löscht lokale, nicht gepushte Commits
  • Macht Änderungen, die Sie an verfolgten Dateien vorgenommen haben, rückgängig
  • Stellt gelöschte, verfolgte Dateien wieder her
  • Löscht die Dateien/Verzeichnisse, die in .gitignore (wie Build-Dateien)
  • Löscht Dateien/Verzeichnisse, die nicht verfolgt werden und nicht in .gitignore

Anmerkungen

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

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 Übertragungen vorzunehmen, die vorherige Übertragungen rückgängig machen
  • git checkout um zu früheren Übertragungen zurückzugehen (möglicherweise müssen die obigen Befehle zuerst ausgeführt werden)
  • git stash gleich wie git reset oben, aber Sie können es rückgängig machen

0 Stimmen

Entschuldigung, dass ich von den obigen Antworten geklaut habe. Ich benutze diese Referenz ständig, die Buchung meist für mich.

2 Stimmen

Ich bin mir ziemlich sicher, dass die erste Option ( Neu klonen ) tatsächlich "lokale, nicht gepushte Commits löschen" :)

0 Stimmen

Was bedeuten das rote X und das grüne Häkchen? Negiert das rote X den daneben stehenden Satz?

120voto

Michael Durrant Punkte 88734

Wenn Sie alle Änderungen rückgängig machen UND mit dem aktuellen Remote-Master auf dem neuesten Stand sein wollen (z.B. wenn Sie feststellen, dass der Master HEAD sich weiterentwickelt hat, seit Sie von ihm abgezweigt haben, und Ihr Push 'abgelehnt' wird), können Sie

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.

5 Stimmen

Es erscheint wichtig, Folgendes zu präzisieren origin en git reset --hard origin/master (was funktioniert) - ohne sie (d.h. git reset --hard ) scheint sich nichts zu ändern.

0 Stimmen

Ich hatte einige lokale Änderungen und nicht in der Lage, sie durch irgendeinen Befehl loszuwerden habe ich git reset --hard origin/master und es war in der Lage, Master-Änderungen als auch zu ziehen

72voto

Scott Davey Punkte 787

Nachdem ich eine Reihe von Antworten gelesen und ausprobiert habe, bin ich auf verschiedene Problemfälle gestoßen, die dazu führen, dass die Arbeitskopie manchmal nicht vollständig bereinigt wird.

Hier ist mein aktuelles Bash-Skript dafür, das immer funktioniert.

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

Von der Arbeitskopie aus starten Wurzelverzeichnis.

10 Stimmen

Der letzte Befehl gibt mir error: pathspec 'HEAD' did not match any file(s) known to git.

1 Stimmen

Bei mir hat es funktioniert, als ich das "--" herausgenommen habe. git checkout HEAD

7 Stimmen

git reset --hard macht verfolgte Dateien rückgängig (bereitgestellt oder nicht), git clean -f -d entfernt nicht verfolgte Dateien, git checkout -- HEAD Wozu brauchen wir das dann?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X