707 Stimmen

Verschiedene Möglichkeiten, lokale Git-Änderungen rückgängig zu machen

Ich habe gerade ein Git-Repository geklont und einen Branch ausgecheckt. Ich habe daran gearbeitet und dann beschlossen, alle meine lokalen Änderungen zu entfernen, da ich die originale Kopie haben wollte.

Kurz gesagt, musste ich die folgenden beiden Befehle ausführen, um meine lokalen Änderungen zu entfernen

git checkout .

git clean -f

Meine Frage ist,

(1) Ist dies der richtige Ansatz, um lokale Änderungen loszuwerden, oder lassen Sie mich wissen, wenn es einen anderen richtigen Ansatz gibt.

(2) wann verwenden wir git reset --hard, da ich ohne diesen Befehl auch zurücksetzen kann

Danke

*Lösung: Hauptbearbeitung(en): 03/26 : * Viele vage Begriffe durch git-spezifische Terminologie ersetzt [verfolgt/unverfolgt/bereit/nicht bereit]

Es gibt nur drei Kategorien von Dateien, wenn wir lokale Änderungen vornehmen:

Typ 1. Bereite verfolgte Dateien vor

Typ 2. Nicht bereite verfolgte Dateien

Typ 3. Nicht bereite nicht verfolgte Dateien auch als nicht verfolgte Dateien bezeichnet

  • Bereit - Dies sind Dateien, die in den Zwischenspeicher verschoben wurden/hinzugefügt wurden
  • Verfolgt - geänderte Dateien
  • Nicht verfolgt - neue Dateien. Immer unvorbereitet. Wenn sie in den Zwischenspeicher verschoben wurden, bedeutet dies, dass sie verfolgt werden.

Was jeder Befehl bewirkt:

  1. git checkout . - Entfernt nur nicht vorbereitete verfolgte Dateien [Typ 2]

  2. git clean -f - Entfernt nur nicht bereite nicht verfolgte Dateien [Typ 3]

  3. git reset --hard - Entfernt nur bereite verfolgte und nicht bereite verfolgte Dateien [Typ 1, Typ 2]

  4. git stash -u - Entfernt alle Änderungen [Typ 1, Typ 2, Typ 3]

Schlussfolgerung:

Es ist offensichtlich, dass wir entweder

(1) Kombination aus `git clean -f` und `git reset --hard` verwenden können

ODER

(2) `git stash -u`

um das gewünschte Ergebnis zu erzielen.

Hinweis: Beim Stashing, wie das Wort schon sagt, 'Etwas sicher und geheim an einem bestimmten Ort aufbewahren'. Dies kann jederzeit mit git stash pop abgerufen werden. Daher ist die Wahl zwischen den beiden obigen Optionen die Entscheidung des Entwicklers.

Vielen Dank an Christoph und Frederik Schøning.

Bearbeitung: 03/27

Ich dachte, es ist es wert, die Vorsicht Notiz zu git clean -f hinzuzufügen

git clean -f

Es gibt kein Zurück. Verwenden Sie -n oder --dry-run, um die Schäden zu sehen, die Sie verursachen werden.

Wenn Sie auch Verzeichnisse entfernen möchten, führen Sie git clean -f -d aus

Wenn Sie nur ignorierte Dateien entfernen möchten, führen Sie git clean -f -X aus

Wenn Sie sowohl ignorierte als auch nicht ignorierte Dateien entfernen möchten, führen Sie git clean -f -x aus

Referenz: Weitere Informationen zu git clean: Wie entfernt man lokale (nicht nachverfolgte) Dateien aus dem aktuellen Git-Arbeitsverzeichnis?

Bearbeitung: 05/20/15

Alle lokalen Commits auf diesem Branch verwerfen [Lokale Commits entfernen]

Um alle lokalen Commits auf diesem Branch zu verwerfen, um den lokalen Branch identisch mit dem "upstream" dieses Branchs zu machen, führen Sie einfach git reset --hard @{u} aus

Referenz: http://sethrobertson.github.io/GitFixUm/fixup.html

oder führen Sie git reset --hard origin/master aus [wenn der lokale Branch master ist]

Hinweis: 06/12/2015 Dies ist kein Duplikat der anderen SO-Frage, die als Duplikat markiert ist. Diese Frage behandelt, wie man lokale GIT-Änderungen entfernt [eine hinzugefügte Datei entfernen, Änderungen an einer vorhandenen Datei entfernen usw. und die verschiedenen Ansätze; Während der andere SO-Thread nur behandelt, wie man lokale Commits entfernt. Wenn Sie eine Datei hinzugefügt haben und diese allein entfernen möchten, diskutiert der andere SO-Thread dies nicht. Daher ist dieses nicht ein Duplikat des anderen.]

Bearbeitung: 06/23/15

Wie kann ein bereits in ein Remote-Repository gepuschter Commit rückgängig gemacht werden?

$ git revert ab12cd15

Bearbeitung: 09/01/2015

Einen früheren Commit vom lokalen Branch und Remote-Branch löschen

Fall: Sie haben gerade eine Änderung in Ihrem lokalen Branch committet und sofort in den Remote-Branch gepuscht, Plötzlich bemerkt, Oh nein! Ich brauche diese Änderung nicht. Was nun?

git reset --hard HEAD~1 [um diesen Commit vom lokalen Branch zu löschen]

git push origin HEAD --force [beide Befehle müssen ausgeführt werden. Um es aus dem Remote-Branch zu löschen]

Was ist der Branch? Es ist der aktuell ausgecheckte Branch.

Bearbeitung 09/08/2015 - Lokales Git-Merge entfernen:

Ich befinde mich auf dem master-Branch und habe den master-Branch mit einem neu erstellten Arbeitsbranch phase2 zusammengeführt

$ git status
# Im Branch master

$ git merge phase2

$ git status
# Im Branch master
# Ihr Branch liegt 8 Commits vor 'origin/master'.

Frage: Wie wird man diese Zusammenführung los? Habe git reset --hard und git clean -d -f ausprobiert Beides hat nicht funktioniert.

Das einzige, was funktionierte, sind die folgenden Optionen:

$ git reset --hard origin/master

oder

$ git reset --hard HEAD~8

oder

$ git reset --hard 9a88396f51e2a068bb7 [sha-Commit-Code - das ist der, der vorhanden war, bevor alle Ihre Zusammenführungs-Commits stattfanden]

558voto

Es hängt alles genau davon ab, was genau Sie rückgängig machen/wiederherstellen möchten. Beginnen Sie damit, den Beitrag unter dem Link von Ube zu lesen. Aber um eine Antwort zu versuchen:

Hard-Reset

git reset --hard [HEAD]

entfernt vollständig alle inszenierten und nicht inszenierten Änderungen an verfolgten Dateien.

Ich verwende oft Hard-Reset, wenn ich denke "einfach alles rückgängig machen, als hätte ich eine vollständige Neuklonung vom Remote durchgeführt". In Ihrem Fall, wo Sie Ihr Repository einfach makellos haben möchten, würde dies funktionieren.

Clean

git clean [-f]

Entfernen von Dateien, die nicht verfolgt werden.

Zum Entfernen temporärer Dateien, aber Beibehalten von inszenierten und nicht inszenierten Änderungen an bereits verfolgten Dateien. Meistens würde ich wahrscheinlich eine Ignorierregel erstellen, anstatt wiederholt zu säubern - z.B. für die bin/obj-Ordner in einem C#-Projekt, die Sie normalerweise von Ihrem Repository ausschließen würden, um Platz zu sparen, oder so etwas.

Die -f (Force) Option entfernt auch Dateien, die nicht verfolgt werden, und auch durch die Git-Ignorierregel ignoriert werden. Im obigen Fall mit einer Ignorierregel, um die bin/obj-Ordner niemals zu verfolgen, selbst wenn diese Ordner von Git ignoriert werden, werden sie mit der Force-Option von Ihrem Dateisystem entfernt. Ich habe gelegentlich eine Verwendung dafür gesehen, z.B. beim Skripting von Bereitstellungen und wenn Sie Ihren Code vor dem Bereitstellen, Zippen oder Ähnlichem bereinigen möchten.

Git Clean wird Dateien, die bereits verfolgt werden, nicht berühren.

Checkout "dot"

git checkout .

Ich hatte diese Notation tatsächlich noch nie gesehen, bevor ich Ihren Beitrag gelesen habe. Ich habe Schwierigkeiten, Dokumentation dazu zu finden (vielleicht kann jemand helfen), aber beim Herumspielen sieht es so aus, als ob es bedeutet:

"Alle Änderungen in meinem Arbeitsverzeichnis rückgängig machen".

Stashing

Einige Antworten erwähnen Stashing. Wie der Begriff nahelegt, würden Sie Stashing wahrscheinlich verwenden, wenn Sie mitten in etwas sind (nicht bereit für einen Commit) und vorübergehend auf andere Branches wechseln müssen oder auf irgendeine Weise an einem anderen Zustand Ihres Codes arbeiten müssen, um später zu Ihrem "chaotischen Schreibtisch" zurückzukehren. Ich sehe nicht, dass dies auf Ihre Frage zutrifft, aber es ist definitiv nützlich.

Zusammenfassen

Im Allgemeinen, wenn Sie sicher sind, dass Sie wichtige Änderungen committed und vielleicht auch auf ein Remote-Repository gepusht haben, wenn Sie einfach herumspielen oder Ähnliches, mit git reset --hard HEAD gefolgt von git clean -f werden Sie Ihren Code definitiv auf den Stand reinigen, den er hätte, wenn er gerade geklont und von einem Branch ausgecheckt worden wäre. Es ist wirklich wichtig zu betonen, dass das Zurücksetzen auch inszenierte, aber uncommittete Änderungen entfernen wird. Es wird alles löschen, was nicht committet wurde (mit Ausnahme nicht verfolgter Dateien, in diesem Fall verwenden Sie clean).

Alle anderen Befehle sind da, um komplexere Szenarien zu erleichtern, in denen eine Granularität des "Rückgängigmachens von Sachen" erforderlich ist :)

Ich glaube, Ihre Frage #1 ist abgedeckt, aber abschließend zu #2: Der Grund, warum Sie nie die Notwendigkeit sahen, git reset --hard zu verwenden, war, dass Sie nie etwas inszeniert hatten. Hätten Sie eine Änderung inszeniert, weder git checkout . noch git clean -f hätten das rückgängig gemacht.

Ich hoffe, das deckt ab.

23voto

Christoph Punkte 23599

Wie bei allem in git gibt es mehrere Möglichkeiten, es zu tun. Die beiden von dir verwendeten Befehle sind eine Möglichkeit, es zu tun. Eine andere Möglichkeit wäre einfach, sie mit git stash -u zu verstecken. Das -u stellt sicher, dass auch neu hinzugefügte Dateien (unerfasste) eingeschlossen werden.

Das Praktische an git stash -u ist, dass

  1. es wahrscheinlich der einfachste (einzige?) einzelne Befehl ist, um dein Ziel zu erreichen
  2. falls du es dir anders überlegst, bekommst du alles wieder mit git stash pop zurück (es ist wie das Löschen einer E-Mail in Gmail, wo du einfach rückgängig machen kannst, wenn du es dir anders überlegst)

Was deine andere Frage betrifft, git reset --hard entfernt nicht die unerfassten Dateien, daher bräuchtest du immer noch git clean -f. Aber ein git stash -u könnte am bequemsten sein.

9voto

Actung Punkte 1466

1. Wenn Sie Ihre lokalen Änderungen überhaupt nicht behalten möchten.

git reset --hard

Dieser Befehl entfernt alle lokalen Änderungen vollständig aus Ihrem lokalen Repository. Dies ist der beste Weg, Konflikte während des Pull-Befehls zu vermeiden, nur wenn Sie Ihre lokalen Änderungen überhaupt nicht behalten möchten.

2. Wenn Sie Ihre lokalen Änderungen behalten möchten

Wenn Sie die neuen Änderungen vom Remote abrufen und die lokalen Änderungen während dieses Abrufs ignorieren möchten, dann,

git stash

Es wird alle lokalen Änderungen zwischenspeichern, jetzt können Sie die Remote-Änderungen abrufen,

git pull

Jetzt können Sie Ihre lokalen Änderungen zurückholen, indem Sie,

git stash pop

6voto

Emmanuel Mahuni Punkte 1403

Ich denke, git hat eine Sache, die nicht klar dokumentiert ist. Ich denke, sie wurde tatsächlich vernachlässigt.

git checkout .

Mann, du hast meinen Tag gerettet. Ich habe immer Dinge, die ich mit dem geänderten Code ausprobieren möchte. Aber manchmal enden die Dinge damit, den geänderten Code durcheinander zu bringen, neue unverfolgte Dateien hinzuzufügen, usw. Also, was ich tun möchte, ist, das zu inszenieren, was ich will, das Durcheinander zu machen, dann schnell aufräumen und commiten, wenn ich zufrieden bin.

git clean -fd funktioniert gut für unverfolgte Dateien.

Dann entfernt git reset einfach inszeniertes, aber git checkout ist irgendwie zu umständlich. Dateien einzeln anzugeben oder Verzeichnisse zu verwenden ist nicht immer ideal. Manchmal befinden sich die geänderten Dateien, die ich loswerden möchte, in Verzeichnissen, die ich behalten möchte. Ich wünschte mir diesen einen Befehl, der einfach nur uninszenierte Änderungen entfernt und hier bist du. Danke.

Aber ich denke, sie sollten einfach git checkout ohne Optionen haben, alle uninszenierten Änderungen entfernen und die inszenierten nicht berühren. Es ist irgendwie modular und intuitiv. Ähnlicher wie das, was git reset macht. git clean sollte auch dasselbe tun.

4voto

Tadas Stasiulionis Punkte 1316

Verwendung:

git checkout -- 

Um die Änderungen im Arbeitsverzeichnis zu verwerfen.

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