it-swarm.com.de

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

Ich habe ein Projekt, in dem ich git init ausgeführt habe. Nach mehreren Commits habe ich git status gemacht, was mir sagte, dass alles auf dem neuesten Stand war und es keine lokalen Änderungen gab.

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

git reset --hard HEAD
1780

Wenn Sie die an Ihrer Arbeitskopie vorgenommenen Änderungen rückgängig machen möchten, gehen Sie folgendermaßen vor:

git checkout .

Wenn Sie die am Index vorgenommenen Änderungen (d. H. Die von Ihnen hinzugefügten) rückgängig machen möchten, tun Sie dies. Warnung, dies setzt alle Ihre nicht gedrängten Commits auf master zurück!:

git reset

Wenn Sie eine von Ihnen festgeschriebene Änderung rückgängig machen möchten, gehen Sie folgendermaßen vor:

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
3172

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

git clean -fd

wie

git reset --hard

will not entferne nicht verfolgte Dateien, wobei als git-clean alle Dateien aus dem verfolgten Stammverzeichnis entfernt werden, die nicht unter git tracking stehen. WARNUNG - ACHTUNG! 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"

Dies kann bei verschiedenen Vorgängen auftreten, z. B. beim Aktualisieren einer Arbeitskopie, wenn Sie und Ihr Freund beide eine neue Datei mit demselben Namen hinzugefügt haben, diese jedoch zuerst in die Quellcodeverwaltung übernommen hat und es Ihnen egal ist, Ihre nicht nachverfolgte Kopie zu löschen .

In dieser Situation können Sie durch Ausführen eines Testlaufs auch eine Liste der Dateien anzeigen, die überschrieben werden würden.

371
Antony Stubbs

Neu klonen

_GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
_
  • ✅ Löscht lokale, nicht übertragene Commits
  • ✅ Setzt Änderungen zurück, die Sie an nachverfolgten Dateien vorgenommen haben
  • ✅ Stellt nachverfolgte Dateien wieder her, die Sie gelöscht haben
  • ✅ Löscht Dateien/Verzeichnisse, die in _.gitignore_ aufgelistet sind (wie Build-Dateien).
  • ✅ Löscht Dateien/Verzeichnisse, die nicht verfolgt werden und sich nicht in _.gitignore_ befinden.
  • ???? Sie werden diesen Ansatz nicht vergessen
  • ???? Verschwendet 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 übertragene Commits
  • ✅ Setzt Änderungen zurück, die Sie an nachverfolgten Dateien vorgenommen haben
  • ✅ Stellt nachverfolgte Dateien wieder her, die Sie gelöscht haben
  • ✅ Löscht Dateien/Verzeichnisse, die in _.gitignore_ aufgelistet sind (wie Build-Dateien).
  • ✅ Löscht Dateien/Verzeichnisse, die nicht verfolgt werden und sich nicht in _.gitignore_ befinden.

Reinigen

_git clean --force -d -x
_
  • ❌ Löscht lokale, nicht übertragene Commits
  • ❌ Setzt Änderungen zurück, die Sie an nachverfolgten Dateien vorgenommen haben
  • ❌ Stellt nachverfolgte Dateien wieder her, die Sie gelöscht haben
  • ✅ Löscht Dateien/Verzeichnisse, die in _.gitignore_ aufgelistet sind (wie Build-Dateien).
  • ✅ Löscht Dateien/Verzeichnisse, die nicht verfolgt werden und sich nicht in _.gitignore_ befinden.

Zurücksetzen

_git reset --hard
_
  • ❌ Löscht lokale, nicht übertragene Commits
  • ✅ Setzt Änderungen zurück, die Sie an nachverfolgten Dateien vorgenommen haben
  • ✅ Stellt nachverfolgte Dateien wieder her, die Sie gelöscht haben
  • ❌ Löscht Dateien/Verzeichnisse, die in _.gitignore_ aufgelistet sind (wie Build-Dateien).
  • ❌ Löscht Dateien/Verzeichnisse, die nicht verfolgt werden und sich nicht in _.gitignore_ befinden.

Anmerkungen

Testfall zur Bestätigung aller obigen Punkte (mit 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 Commits zu erstellen, die vorherige Commits rückgängig machen
  • git checkout um in der Zeit zu vorherigen Commits zurückzukehren (möglicherweise müssen die obigen Befehle zuerst ausgeführt werden)
  • git stash wie _git reset_, aber Sie können es rückgängig machen
107

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 der Master HEAD seit dem Verzweigen vorwärtsgerückt ist und Ihr Push "abgelehnt" wird) ) können Sie verwenden

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.
74
Michael Durrant

Schau in Git-Reflog. Es werden alle Status aufgelistet, an die es sich erinnert (Standard ist 30 Tage), und Sie können einfach den gewünschten Status auschecken. Zum Beispiel:

$ 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 [email protected]{0}: HEAD^^: updating HEAD
ae7c2b3 [email protected]{1}: commit: Append e to a
fdf2c5e [email protected]{2}: commit: Append d to a
145c322 [email protected]{3}: commit: Append c to a
363e22a [email protected]{4}: commit: Append b to a
fa26c43 [email protected]{5}: commit: Append foo to a
0a392a5 [email protected]{6}: commit (initial): Add file a
$ git reset --hard [email protected]{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d
48
William Pursell

Nachdem ich eine Reihe von Antworten gelesen und ausprobiert habe, habe ich verschiedene Edge-Fälle gefunden, die manchmal bedeuten, dass sie die Arbeitskopie nicht vollständig bereinigen.

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

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

Führen Sie aus dem Stammverzeichnis der Arbeitskopie.

34
Scott Davey

GEFAHR VORAUS: (Bitte lesen Sie die Kommentare. Wenn Sie den in meiner Antwort vorgeschlagenen Befehl ausführen, wird möglicherweise mehr gelöscht, als Sie möchten.)

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

git clean -f -d
34
Tobias Gassmann

sag einfach

git stash

dadurch werden alle Ihre lokalen Chages entfernt. und Sie können auch später verwenden, indem Sie sagen

git stash apply 
32
piyushmandovra

Ich bin auf ein ähnliches Problem gestoßen. Die Lösung besteht darin, git log zu verwenden, um festzustellen, welche Version des lokalen Commits sich von der Remote-Version unterscheidet. (Zum Beispiel ist die Version 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Verwenden Sie dann git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec, um die Änderung rückgängig zu machen.

26
Patrick

Ich habe nach einem ähnlichen Thema gesucht,

Wollte lokale Commits wegwerfen:

  1. repository geklont (Git-Klon)
  2. auf dev branch umgestellt (git checkout dev)
  3. wenige Commits ausgeführt (git commit -m "commit 1")
  4. entschied sich jedoch, diese lokalen Commits zu verwerfen, um zu Remote zurückzukehren (Origin/dev)

So auch das Folgende:

git reset --hard Origin/dev

Prüfen:

git status  

        On branch dev  
        Your branch is up-to-date with 'Origin/dev'.  
        nothing to commit, working tree clean  

jetzt gehen lokale Commits verloren und kehren in den ursprünglichen geklonten Zustand (Punkt 1 oben) zurück.

12

Versuchen Sie dies, um alle nicht festgeschriebenen Änderungen in der lokalen Verzweigung rückgängig zu machen

$ git reset --hard HEAD

Aber wenn Sie einen Fehler wie diesen sehen:

fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.

Sie können zum Ordner '.git' navigieren und die index.lock-Datei löschen:

$ cd /directory/for/your/project/.git/
$ rm index.lock

Führen Sie abschließend den folgenden Befehl erneut aus:

$ git reset --hard HEAD
6
Janderson Silva

Möglicherweise möchten/müssen Sie Ihre Arbeit/Dateien nicht unbedingt in Ihrem Arbeitsverzeichnis ablegen, sondern müssen sie einfach vollständig entfernen. Der Befehl git clean erledigt dies für Sie.

Einige häufige Anwendungsfälle hierfür sind: cruft entfernen, das durch Zusammenführungen oder externe Tools generiert wurde, oder entfernen Sie andere Dateien, damit Sie einen sauberen Build ausführen können.

Denken Sie daran, dass Sie bei diesem Befehl sehr vorsichtig sein sollten, da er Dateien aus Ihrem lokalen Arbeitsverzeichnis entfernt, die NICHT VERFOLGT sind. Wenn Sie nach der Ausführung dieses Befehls plötzlich Ihre Meinung ändern, wird der Inhalt der entfernten Dateien nicht mehr angezeigt. Eine Alternative, die sicherer ist, ist die Ausführung

git stash --all

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

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

git clean -f -d

Dadurch werden alle Dateien und auch alle Unterverzeichnisse entfernt, die aufgrund des Befehls keine Elemente enthalten. Bevor Sie den Befehl git clean -f -d ausführen, müssen Sie Folgendes ausführen

git clean -f -d -n

hier sehen Sie eine Vorschau dessen, was nach dem Ausführen von git clean -f -d entfernt wird.

Hier finden Sie eine Zusammenfassung Ihrer Optionen von am aggressivsten bis am wenigsten aggressiv


Option 1: Alle Dateien lokal entfernen (am aggressivsten)

git clean -f -d

Option 2: Vorschau der oben genannten Auswirkungen (Vorschau der aggressivsten)

git clean -f -d -n

Option: Alle Dateien verstecken (am wenigsten aggressiv)

`git stash --all` 
6
joey