Wie kann ich ein Commit zurücksetzen?

245529
n179911

Ich habe 2 Commits, die ich nicht gedrückt habe:

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

Wie kann ich meine erste zurücksetzen (die älteste), aber die zweite 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 tun:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e 

Das ist?

119
Diese Frage scheint nicht thematisch zu sein, da es sich um ein Programmierwerkzeug handelt. Es gehört zum Stack Overflow. Peter Mortensen vor 10 Jahren 3
@PeterMortensen vereinbart. Dies ist ein Bereich für SuperUser Kolob Canyon vor 6 Jahren 0

9 Antworten auf die Frage

92
jtimberman

Der sicherste und wahrscheinlich sauberste Weg ist das interaktive Erkennen.

git rebase -i HEAD^^ 

Oder,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^ 

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

Sie können ein Commit mit rückgängig machen, git revertaber es werden weitere Commit-Nachrichten zum Verlauf hinzugefügt, was unerwünscht sein kann. Verwenden Sie den -nParameter, um Git mitzuteilen, dass der Revert nicht sofort übernommen wird. Sie können interaktiv rebasieren und diese auf einen vorherigen Commit drücken, um die Dinge sauber zu halten.

Wenn die beiden Commits, mit denen Sie hier arbeiten, dieselben Dateien betreffen, wird möglicherweise ein Zusammenführungskonflikt angezeigt.

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

Das Umschreiben der Geschichte sollte mit Vorsicht erfolgen.

Wie kann ich ein Commit in 'git rebase' löschen? Es gibt nur drei Befehle: Wählen, Bearbeiten, Squash. Es gibt kein Löschen von AFAIK. n179911 vor 15 Jahren 0
Löschen Sie die Zeile vollständig aus der Liste, und der Commit wird gelöscht jtimberman vor 15 Jahren 8
Als ich die Änderung rückgängig machen wollte, wollte ich keine Spur davon lassen. Wenn Sie auch keine Spur von Ihrem Revert hinterlassen möchten, ist dies der beste Weg, dies zu tun. Phillip Whelan vor 13 Jahren 0
"Der sicherste und wahrscheinlich sauberste Weg ist interaktiv zu rebasieren" Vielleicht nicht, wenn Sie vim nicht verwenden. Ich hatte Glück und habe aus diesem Schlamassel herausgefunden. Immer noch auf dem Vormarsch, weil ich vim lernen sollte :-) isimmons vor 10 Jahren 0
Ich würde vorschlagen, "rebase" so wenig wie möglich zu verwenden. Wenn Sie mit anderen zusammenarbeiten, machen Sie einfach "revert". boldnik vor 10 Jahren 0
@isimmons niemand muss vi / vim verwenden; Es gibt mehrere Möglichkeiten, zu einem anderen Editor wie Nano oder Emacs zu wechseln: http://stackoverflow.com/questions/2596805/how-do-i-make-git-use-the-editor-of-my-choice-for- begeht Daniel Alder vor 7 Jahren 0
48
iStryker

Dies ist von http://nakkaya.com/2009/09/24/git-delete-last-commit/ und es hat für mich funktioniert

Git Delete Last Commit

Ab und zu spät in der Nacht, wenn ich keinen Kaffee mehr habe, lege ich Sachen fest, die ich nicht haben sollte. Dann verbringe ich die nächsten 10 - 15 Minuten damit, das letzte Commit zu entfernen, das ich gemacht habe. Nach dem dritten Mal wollte ich eine Aufzeichnung machen, damit ich später darauf zurückgreifen kann.

Wenn Sie Junk begangen haben, aber nicht gestoßen wurden,

git reset --hard HEAD~1

HEAD ~ 1 ist eine Abkürzung für das Commit vor dem Kopf. Alternativ können Sie sich auf den SHA-1 des Hashs beziehen, auf den Sie zurücksetzen möchten. Beachten Sie, dass bei Verwendung von --hard alle Änderungen an verfolgten Dateien im Arbeitsbaum seit dem Commit vor dem Head verloren gehen.

Wenn Sie die geleistete Arbeit --softnicht löschen möchten, können Sie die Option verwenden, mit der das Commit gelöscht wird. Alle geänderten Dateien bleiben jedoch "Changes to Commit", so wie es der git-Status bedeutet.

Wenn Sie bereits gedrückt haben und jemand gezogen hat, was normalerweise mein Fall ist, können Sie git reset nicht verwenden. Sie können jedoch einen Git-Revert machen,

git revert HEAD

Dadurch wird ein neues Commit erstellt, das alles, was durch das versehentliche Commit eingeführt wurde, aufhebt.

Mit der Option --soft ist es ideal, wenn Sie eine Datei umbenennen und versehentlich "git commit -a" verwenden, anstatt zuerst "git add" zu verwenden. Aaron Harun vor 11 Jahren 2
8
Peltier

Nee. git-reset --hard bringt dich zurück in die Geschichte. Was Sie suchen, ist git revert, wodurch alle Commits rückgängig gemacht werden.

Nun, das funktioniert, verschmutzt aber auch das Commit-Log. Wenn diese Commits nicht bereits verschoben / gezogen wurden, ist es besser, sie mit einer interaktiven Basis zu bereinigen. Die Möglichkeit, den Verlauf zu ändern, ist einer der Hauptvorteile von git gegenüber anderen Versionskontrollsystemen. knweiss vor 15 Jahren 4
5
hamstar

Ich habe das gerade gemacht:

git rebase -i HEAD^^ 

Ich habe es vermasselt, also tat ich es

git rebase --abort 

Dann tat es wieder. Dann musste ich so pushen:

git push origin master -f 

Und es zerstörte die Commits neuer als das Commit, auf das ich zurückgerollt hatte. Hat super gearbeitet.

4
mattd

In Bezug auf den Kommentar von git reset --hardjtimberman, dass er rückgängig gemacht werden kann, stimmt das nicht ganz. Siehe hier: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1

3
knweiss

Nein, git reset --hard baf8d5edas 3368e1cCommit wird gelöscht und HEAD wird baf8d5edanach angezeigt .

Wenn Sie das 3368e1cCommit beibehalten und das Commit löschen möchten bad8d5e, ist die einfachste Lösung ein " git rebase -i HEAD~2" (interaktives Rebase der beiden letzten Commits). Mit diesem Befehl wird der Commit-Nachrichten-Editor gestartet, und für jedes der beiden letzten Commits wird eine Zeile angezeigt. Dort löscht man einfach die bad8d5eCommit-Zeile und speichert. git schreibt dann Ihre Geschichte um und der 2. Commit wird weg sein.

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)!

2
lokeshpahal
git checkout <treeish> -- /path/to/dir 

Dadurch wird das Verzeichnis von der angegebenen "treeish" für / path / nach / dir zurückgegeben

1
squeegee
git reset --hard 

Die einzige Möglichkeit, ein Commit rückgängig zu machen, wenn nur ein weiteres Commit im Repo vorhanden ist (z. B. Initial Commit und ein weiteres Commit). Der Rest der Wege (revert, rebase) weigert sich zu arbeiten, zumindest ab git 1.7.5.1.

Wenn Sie dem git resetmit folgen, git gcwird git die alten Commit-Daten tatsächlich vollständig aus dem Repo löschen.

0
Leandro M

Ich habe dieses Problem gelöst, indem ich die Hash-Codes der letzten Commits aus den HEAD-Dateien im Repository-Ordner manuell editierte:

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

Zuvor war ich nie in der Lage, die UNMERGE-Operationen, die ich vor Ort durchführte, zu starten. Es wurde immer wieder behauptet, es sei "nicht in der Lage gewesen, einige Verweise zu verschieben" an das zentrale Repository.