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

81voto

Jade Han Punkte 1005

Sie können verwenden:

git reset HEAD@{1}

Dieser Befehl löscht Ihren falschen Commit ohne ein Git-Protokoll.

76voto

Mohit Punkte 736

Rückgängig machen der letzten Übergabe

Es gibt viele Situationen, in denen man die letzte Übertragung in den Code rückgängig machen möchte. Zum Beispiel, weil Sie ihn umfassend umstrukturieren möchten - oder ihn sogar ganz verwerfen wollen!

In diesen Fällen ist der Befehl "Zurücksetzen" Ihr bester Freund:

$ git reset --soft HEAD~1

Mit dem obigen Befehl (reset) wird der aktuelle HEAD-Zweig auf die angegebene Revision zurückgespult. In unserem obigen Beispiel möchten wir zu der Revision vor der aktuellen Revision zurückkehren - und damit unsere letzte Übergabe rückgängig machen.

Beachten Sie die --soft Flagge: Damit wird sichergestellt, dass die Änderungen in rückgängig gemachten Revisionen erhalten bleiben. Nachdem Sie den Befehl ausgeführt haben, finden Sie die Änderungen als nicht übertragene lokale Änderungen in Ihrer Arbeitskopie.

Wenn Sie diese Änderungen nicht beibehalten wollen, verwenden Sie einfach die --hard Flagge. Tun Sie dies nur, wenn Sie sicher sind, dass Sie diese Änderungen nicht mehr benötigen.

$ git reset --hard HEAD~1

Enter image description here

73voto

steven Punkte 524

Machen Sie einfach die letzte Übertragung rückgängig:

git reset --soft HEAD~

Oder die vorletzte Zeit rückgängig machen:

git reset --soft HEAD~2

Oder machen Sie eine frühere Übertragung rückgängig:

git reset --soft <commitID>

(Sie können die CommitID mit git reflog )

Wenn Sie eine frühere Übertragung rückgängig machen, denken Sie daran, den Arbeitsplatz mit

git clean

Weitere Einzelheiten finden Sie in der Dokumentation: git-reset

68voto

CodeWizard Punkte 108377

Bevor wir antworten, sollten wir etwas Hintergrundwissen hinzufügen und erklären, was dies ist HEAD .

First of all what is HEAD?

HEAD ist einfach ein Verweis auf die aktuelle Übertragung (latest) auf dem aktuellen Zweig.
Es kann nur eine einzige HEAD zu jedem beliebigen Zeitpunkt. (ausgenommen git worktree )

Der Inhalt von HEAD ist gespeichert in .git/HEAD und enthält die 40 Bytes SHA-1 der aktuellen Übertragung.


detached HEAD

Wenn Sie nicht auf dem neuesten Stand sind - was bedeutet, dass HEAD auf eine frühere Übertragung in der Historie verweist, heißt es detached HEAD .

enter image description here

In der Befehlszeile sieht es dann so aus - SHA-1 anstelle des Zweignamens, da die HEAD nicht auf die Spitze des aktuellen Zweigs zeigt

enter image description here

enter image description here

Ein paar Möglichkeiten, wie man sich von einem abgetrennten HEAD erholen kann:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Dadurch wird ein neuer Zweig ausgecheckt, der auf den gewünschten Commit verweist.
Dieser Befehl führt einen Checkout zu einem bestimmten Commit durch.
An dieser Stelle können Sie eine Verzweigung erstellen und ab diesem Punkt mit der Arbeit beginnen.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Sie können jederzeit die reflog auch.
git reflog werden alle Änderungen angezeigt, die die HEAD und das Auschecken des gewünschten Reflog-Eintrags setzt die HEAD zurück zu diesem Commit.

Jedes Mal, wenn der HEAD geändert wird, wird ein neuer Eintrag in der reflog

git reflog
git checkout HEAD@{...}

So kommen Sie zurück zu Ihrer gewünschten Verpflichtung

enter image description here


_git reset --hard <commit_id>_

"Bewegen" Sie Ihren HEAD zurück zum gewünschten Commit.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
  • Anmerkung: ( Seit Git 2.7 )
    können Sie auch die git rebase --no-autostash auch.

git revert <sha-1>

"Rückgängig machen" des angegebenen Commits oder Commit-Bereichs.
Der Befehl reset macht alle Änderungen, die in der gegebenen Übertragung vorgenommen wurden, "rückgängig".
Ein neuer Commit mit dem rückgängig gemachten Patch wird übertragen, während der ursprüngliche Commit ebenfalls in der Historie verbleibt.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Dieses Schema veranschaulicht, welcher Befehl was bewirkt.
Wie Sie sehen können, gibt es reset && checkout ändern die HEAD .

enter image description here

67voto

FraK Punkte 840

In meinem Fall habe ich in den falschen Zweig übertragen und gepusht. Was ich wollte, war, alle meine Änderungen zurückzubekommen, damit ich sie in einen neuen, korrekten Zweig übertragen kann, also habe ich dies getan:

Wenn Sie auf demselben Zweig, den Sie committed und gepusht haben, "git status" eingeben, werden Sie nichts Neues sehen, weil Sie committed und gepusht haben:

    git reset --soft HEAD~1

Dadurch werden alle Ihre Änderungen (Dateien) wieder in den Stage-Bereich gebracht. Um sie wieder in das Arbeitsverzeichnis (unstage) zu bringen, geben Sie einfach ein:

git reset FILE

Dabei ist "Datei" die Datei, die Sie erneut übertragen wollen. Diese DATEI sollte sich nun im Arbeitsverzeichnis (unstaged) befinden, mit allen Änderungen, die Sie vorgenommen haben. Nun können Sie zu einem beliebigen Zweig wechseln und die Änderungen in diesem Zweig festschreiben. Natürlich ist der ursprüngliche Zweig, in dem Sie die Änderungen vorgenommen haben, immer noch vorhanden, aber in meinem Fall war das in Ordnung, und wenn nicht, können Sie nach Möglichkeiten suchen, die Änderungen in diesem Zweig rückgängig zu machen.

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