26188 Stimmen

Wie kann ich die letzten lokalen Übertragungen in Git rückgängig machen?

Ich habe aus Versehen die falschen Dateien übertragen a Git aber den Commit noch nicht auf den Server gepusht.

Wie kann ich diese Übertragungen aus dem lokalen Repository rückgängig machen ?

Die einzige Möglichkeit scheint zu sein, die Änderungen in einen GUI-Texteditor zu kopieren, dann den gesamten lokalen Klon zu löschen, dann das Repository neu zu klonen und dann die Änderungen erneut anzuwenden. Allerdings,

  • Dies kann zu Datenverlusten führen.
  • Es ist sehr schwer, dies zu tun, wenn nur eine zufällige git commit ausgeführt wurde.

Gibt es einen besseren Weg?

2 Stimmen

Siehe diese Anleitung für das Rückgängigmachen von Git Commits auf Local, Public und Git Branch Wie man Git Commits wie ein Profi rückgängig macht

703 Stimmen

Weißt du, was Git braucht? git undo , das war's. Dann verschwindet der Ruf von Git, mit Fehlern von uns Normalsterblichen umzugehen. Implementieren Sie, indem Sie den aktuellen Zustand auf einen Git-Stack schieben, bevor Sie eine git Befehl. Es würde die Leistung beeinträchtigen, daher wäre es am besten, ein Konfigurations-Flag hinzuzufügen, das angibt, ob es aktiviert werden soll.

58 Stimmen

@YiminRong Das kann man mit Git's alias Funktion: git-scm.com/book/de/v2/Git-Basics-Git-Aliases

164voto

amd Punkte 19366

WAS ZU VERWENDEN, reset --soft o reset --hard ?

Ich füge der Antwort von @Kyralessa nur zwei Cents hinzu:

Wenn Sie unsicher sind, was Sie verwenden sollen, wählen Sie --soft (Ich habe diese Konvention benutzt, um mich daran zu erinnern. s oft für sicher).

Warum?

Wenn Sie wählen --hard aus Versehen werden Sie LOSE Ihre Änderungen, die es vorher nicht gab. Wenn Sie wählen --soft können Sie aus Versehen die gleichen Ergebnisse erzielen wie bei --hard durch Anwendung zusätzlicher Befehle

git reset HEAD file.html
git checkout -- file.html

Vollständiges Beispiel

echo "some changes..." > file.html
git add file.html
git commit -m "wrong commit"

# I need to reset
git reset --hard HEAD~1 (cancel changes)
# OR
git reset --soft HEAD~1 # Back to staging
git reset HEAD file.html # back to working directory
git checkout -- file.html # cancel changes

Der Dank geht an @Kyralessa.

160voto

code-8 Punkte 48956

Führen Sie dies einfach in Ihrer Befehlszeile aus:

git reset --soft HEAD~

153voto

Spyder Punkte 804

Es gibt viele Möglichkeiten, dies zu tun:

Git-Befehl zum Rückgängigmachen des letzten Commits/der vorherigen Commits:

Warnung: Verwenden Sie --hard nicht, wenn Sie nicht wissen, was Sie tun. --hart ist zu gefährlich und es könnte löschen Sie Ihre Dateien.

Der grundlegende Befehl zum Rückgängigmachen einer Übergabe in Git lautet:

$ git reset --hard <COMMIT -ID>

または

$ git reset --hard HEAD~<n>

COMMIT-ID : ID für die Übertragung

n: Nummer der letzten Übertragungen, die Sie rückgängig machen wollen

Sie können die Commit-ID wie unten gezeigt erhalten:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

donde d81d3f1 et be20eb8 sind commit id.

Schauen wir uns nun einige Fälle an:

Nehmen wir an, Sie wollen die letzte Übertragung "d81d3f1" rückgängig machen. Hier sind zwei Optionen:

$ git reset --hard d81d3f1

または

$ git reset --hard HEAD~1

Angenommen, Sie wollen die Übergabe "be20eb8" rückgängig machen:

$ git reset --hard be20eb8

Für detailliertere Informationen können Sie auch einige andere Befehle ausprobieren, um den Kopf in einen bestimmten Zustand zurückzusetzen:

$ git reset --help

149voto

geoom Punkte 3605

Für eine lokale Übertragung

git reset --soft HEAD~1

oder wenn Sie nicht mehr genau wissen, in welchem Commit er sich befindet, können Sie

git rm --cached <file>

Für eine gepushte Übertragung

Der richtige Weg zum Entfernen von Dateien aus der Repository-Historie ist die Verwendung von git filter-branch . Das heißt,

git filter-branch --index-filter 'git rm --cached <file>' HEAD

Aber ich empfehle Ihnen, diesen Befehl mit Vorsicht zu verwenden. Mehr lesen unter git-filter-branch(1) Handbuchseite .

147voto

dseminara Punkte 11265

Es gibt zwei Hauptszenarien

Sie haben den Commit noch nicht verschoben

Wenn das Problem zusätzliche Dateien waren, die Sie übertragen haben (und die Sie nicht im Repository haben wollen), können Sie diese mit git rm und dann die Übergabe mit --amend

git rm <pathToFile>

Sie können auch ganze Verzeichnisse entfernen mit -r oder sogar in Kombination mit anderen Bash Befehle

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

Nachdem Sie die Dateien entfernt haben, können Sie sie mit --ändern Sie Option

git commit --amend -C HEAD # the -C option is to use the same commit message

Dadurch wird Ihr letzter lokaler Commit umgeschrieben und die zusätzlichen Dateien werden entfernt, so dass diese Dateien beim Push nicht gesendet werden und auch von GC aus Ihrem lokalen .git-Repository entfernt werden.

Sie haben den Commit bereits verschoben

Sie können die gleiche Lösung für das andere Szenario anwenden und dann git push mit dem -f Option, aber es ist nicht empfohlen da es den entfernten Verlauf mit einer abweichenden Änderung überschreibt (das kann Ihr Repository durcheinander bringen).

Stattdessen müssen Sie die Übergabe ohne --amend (Merken Sie sich dies über -amend`: Mit dieser Option wird die Historie der letzten Übergabe neu geschrieben).

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