Wie kann ich ein Commit zurücksetzen?


127

Ich habe 2 Commits, die ich nicht gepusht habe:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

Wie kann ich meinen ersten (den ältesten) zurücksetzen, aber den zweiten behalten?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Von hier:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

Muss ich nur Folgendes tun:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

Das ist?


3
Diese Frage scheint nicht zum Thema zu gehören, da es sich um ein Programmiertool handelt. Es gehört zum Stack Overflow.
Peter Mortensen

@PeterMortensen Einverstanden. Dies ist für SuperUser
Kolob Canyon vom

Antworten:


95

Der sicherste und wahrscheinlich sauberste Weg ist das interaktive Rebasen.

git rebase -i HEAD^^

Oder,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

Von dort aus können Sie Commits quetschen, wodurch ein oder mehrere Commits zum vorherigen Commit zusammengefasst werden. Um ein Commit vollständig aus dem Verlauf zu löschen, löschen Sie die Zeile aus der Liste.

Sie können ein Commit mit git revertzurücksetzen, es werden jedoch mehr Commit-Nachrichten in den Verlauf eingefügt, was möglicherweise unerwünscht ist. Verwenden Sie den -nParameter, um Git anzuweisen, das Zurücksetzen nicht sofort zu bestätigen. Sie können interaktiv rebasieren und diese bis zu einem früheren Commit komprimieren, um die Dinge sauber zu halten.

Wenn die beiden Festschreibungen, mit denen Sie hier arbeiten, dieselbe (n) Datei (en) betreffen, wird möglicherweise ein Zusammenführungskonflikt angezeigt.

Das Zurücksetzen des Repositorys mit git reset --hardsollte mit Vorsicht erfolgen, da es nicht rückgängig gemacht werden kann.

Das Umschreiben des Verlaufs sollte mit Sorgfalt erfolgen.


Wie kann ich ein Commit in während der 'Git Rebase' löschen? Es gibt nur 3 Befehle: auswählen, bearbeiten, quetschen. Es gibt keine AFAIK löschen.
n179911

8
Löschen Sie die Zeile vollständig aus der Liste und löschen Sie das Commit
jtimberman

Als ich die Änderung rückgängig machen wollte, wollte ich keine Spur davon hinterlassen. Wenn Sie auch keine Spur von Ihrer Wiederherstellung hinterlassen möchten, ist dies der beste Weg, dies zu tun.
Phillip Whelan

"Der sicherste und wahrscheinlich sauberste Weg ist es, interaktiv zu rebasieren." Vielleicht nicht, wenn Sie vim nicht verwenden. Ich hatte Glück und fand meinen Weg aus diesem Durcheinander heraus. Ich stimme immer noch zu, weil ich vim lernen sollte :-)
isimmons

Ich würde vorschlagen, rebaseso wenig wie möglich zu verwenden. Wenn Sie mit anderen arbeiten, dann machen Sie einfach revert.
Boldnik

52

Dies ist, wenn von http://nakkaya.com/2009/09/24/git-delete-last-commit/ und es hat bei mir funktioniert

Git Delete Last Commit

Hin und wieder, spät in der Nacht, wenn mir der Kaffee ausgeht, lege ich Dinge fest, die ich nicht haben sollte. Dann verbringe ich die nächsten 10 - 15 Minuten damit, zu googeln, wie ich das letzte Commit entferne, das ich gemacht habe. Also wollte ich nach dem dritten Mal eine Aufzeichnung machen, damit ich später darauf zurückgreifen kann.

Wenn Sie Junk begangen, aber nicht gepusht haben,

git reset --hard HEAD~1

HEAD ~ 1 ist eine Abkürzung für das Festschreiben vor head. Alternativ können Sie sich auf den SHA-1 des Hash beziehen, auf den Sie zurücksetzen möchten. Beachten Sie, dass bei der Verwendung von --hard alle Änderungen an nachverfolgten Dateien im Arbeitsbaum, die seit dem Festschreiben vor head vorgenommen wurden, verloren gehen.

Wenn Sie die geleistete Arbeit nicht auslöschen möchten, können Sie die --softOption verwenden, mit der die Festschreibung gelöscht wird, aber alle Ihre geänderten Dateien bleiben "Zu festschreibende Änderungen", wie es der Git-Status vorschreibt.

Wenn Sie bereits gedrückt und jemand gezogen hat, was normalerweise bei mir der Fall ist, können Sie git reset nicht verwenden. Sie können jedoch einen Git-Revert durchführen,

git revert HEAD

Dadurch wird eine neue Festschreibung erstellt, die alle durch die versehentliche Festschreibung eingeführten Vorgänge rückgängig macht.


2
Mit der Option --soft ist es perfekt, wenn Sie eine Datei umbenennen und versehentlich "git commit -a" eingeben, anstatt zuerst "git add" zu verwenden.
Aaron Harun

8

Nee. git-reset --hard bringt Sie zurück in die Geschichte. Was Sie suchen, ist git revert, wodurch ein Commit rückgängig gemacht wird.


4
Das funktioniert, belastet aber auch das Commit-Protokoll. Wenn diese Commits nicht bereits gepusht / gezogen wurden, ist es besser, sie mit einer interaktiven Rebase zu bereinigen. Die Möglichkeit, den Verlauf zu ändern, ist einer der Hauptvorteile von Git gegenüber anderen Versionskontrollsystemen.
Knweiss

6

Ich habe das gerade gemacht:

git rebase -i HEAD^^

Ich habe es vermasselt, also habe ich es getan

git rebase --abort

Dann habe ich es noch einmal gemacht. Dann musste ich so pushen:

git push origin master -f

Und es hat die Commits zerstört, die neuer sind als das Commit, auf das ich zurückgesetzt hatte. Hat super funktioniert.


4

Nein, git reset --hard baf8d5elöscht das 3368e1cCommit und HEAD ist baf8d5edanach auf.

Wenn Sie das 3368e1cCommit beibehalten und das Commit löschen möchten bad8d5e, ist es am einfachsten, ein " git rebase -i HEAD~2" auszuführen (dh eine interaktive Neubasis der letzten beiden Commits). Mit diesem Befehl wird der Commit-Nachrichten-Editor gestartet, und für die letzten beiden Commits wird jeweils eine Zeile angezeigt. Dort löschen Sie einfach die bad8d5eFestschreibungszeile und speichern. git schreibt dann Ihren Verlauf neu und das 2. Commit ist weg.

Es gibt andere nützliche Befehle , die Sie im Nachrichten - Editor begehen können , wie squash, editetc. Interaktive Unterfütterungsmaterial ist sehr mächtig!

Tun Sie dies nicht, wenn jemand diese Commits bereits gesehen hat (Push oder Pull aus Ihrem Repository)!



1
git reset --hard {ref}

ist die einzige Möglichkeit, ein Commit rückgängig zu machen, wenn sich nur ein weiteres Commit im Repo befindet (z. B. initiales Commit und 1 weiteres). Die übrigen Möglichkeiten (Zurücksetzen, Wiederherstellen) funktionieren nicht, zumindest ab Version 1.7.5.1.

Wenn Sie dem git resetmit einem folgen, git gclöscht git die alten Commit-Daten vollständig aus dem Repo.


1
git checkout <treeish> -- /path/to/dir

Dadurch wird das Verzeichnis aus der angegebenen Baumstruktur für das Verzeichnis / path / to / dir zurückgegeben


0

Ich habe dies erreicht, indem ich die Hash-Codes der letzten Festschreibungen aus den HEAD-Dateien im Repository-Ordner manuell bearbeitete:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

Vorher war es mir nie möglich, die von mir vor Ort durchgeführten UNMERGE-Operationen auf den Weg zu bringen. Es wurde immer wieder gesagt, dass es "einige Refs nicht pushen konnte".

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.