2009-09-03 21:23:58 +0000 2009-09-03 21:23:58 +0000
133
133

Wie kann ich 1 Commit zurücknehmen?

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 meinen ersten (den ältesten) zurücknehmen, aber den zweiten behalten?

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

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

Muss ich nur:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

Das heißt?

Antworten (9)

99
99
99
2009-09-03 21:32:01 +0000

Der sicherste und wahrscheinlich sauberste Weg ist das interaktive Rebase.

git rebase -i HEAD^^

Oder,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

Von dort aus können Sie Commits zerquetschen, wodurch ein oder mehrere Commits zum vorherigen Commit zusammengefügt werden. Um einen Commit vollständig aus der Historie zu löschen, löschen Sie die Zeile aus der Liste.

Mit git revert können Sie einen Commit rückgängig machen, aber dadurch werden weitere Commit-Nachrichten in die Historie aufgenommen, was unerwünscht sein kann. Verwenden Sie den Parameter -n, um Git mitzuteilen, dass es die Rückgängigmachung nicht sofort rückgängig machen soll. Sie können interaktiv eine neue Basis erstellen und diese bis zu einem vorherigen Commit zusammendrücken, um die Dinge sauber zu halten.

Wenn die beiden Commits, mit denen Sie hier arbeiten, die gleiche(n) Datei(en) betreffen, sehen Sie möglicherweise einen Zusammenführungskonflikt.

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

Das Neuschreiben der Historie sollte mit Vorsicht erfolgen.

54
54
54
2011-08-05 17:52:58 +0000

This if from http://nakkaya.com/2009/09/24/git-delete-last-commit/ and it worked for me

Git Delete Last Commit

Ab und zu spät in der Nacht, wenn mir der Kaffee ausgegangen ist, begehe ich Dinge, die ich nicht hätte tun sollen. Dann verbringe ich die nächsten 10 - 15 Minuten damit, zu googeln, wie ich den letzten Commit entfernen kann, den ich gemacht habe. Nach dem dritten Mal wollte ich also eine Aufzeichnung davon machen, damit ich später darauf zurückgreifen kann.

Wenn Sie Junk committet, aber nicht gedrängt haben,

git reset --hard HEAD~1

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

Wenn Sie die Arbeit, die Sie gemacht haben, nicht vernichten wollen, können Sie die Option --soft verwenden, die den Commit löscht, aber alle Ihre geänderten Dateien “Zu übertragende Änderungen” belässt, wie der git-Status es ausdrücken würde.

Wenn Sie bereits gedrückt und jemand gezogen hat, was normalerweise mein Fall ist, können Sie git reset nicht verwenden. Sie können jedoch eine git-Umkehrung durchführen,

git revert HEAD

Dies wird eine neue Übergabe erzeugen, die alles, was durch die versehentliche Übergabe eingeführt wurde, rückgängig macht.

8
8
8
2009-09-03 21:26:55 +0000

Nö. git-reset –hard wird Sie in die Geschichte zurückbringen. Wonach Sie suchen, ist git revert, was jede Verpflichtung rückgängig macht.

6
6
6
2011-12-12 04:39:48 +0000

Ich habe gerade Folgendes getan:

git rebase -i HEAD^^

Ich habe es vermasselt, also habe ich

git rebase --abort

Dann habe ich es wieder getan. Dann musste ich so schieben:

git push origin master -f

Und es zerstörte die Commits, die neuer waren als die Commits, zu denen ich zurückgerollt war. Hat großartig funktioniert.

4
4
4
2010-01-28 03:48:38 +0000

In Bezug auf Jtimbermans Bemerkung, dass git reset --hard nicht rückgängig zu machen sei, ist das nicht ganz richtig. Siehe hier: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1

4
4
4
2009-09-03 21:46:37 +0000

Nein, git reset --hard baf8d5e löscht die Übergabe von 3368e1c und der HEAD befindet sich danach auf baf8d5e.

Wenn Sie die Übergabe von 3368e1c beibehalten und die Übergabe von bad8d5e löschen möchten, ist die einfachste Lösung eine “git rebase -i HEAD~2” (d.h. interaktive Neuverknüpfung der letzten beiden Übergaben). Dieser Befehl startet Ihren Commit-Message-Editor und Sie sehen eine Zeile für jede der letzten beiden Commits. Dort löschen Sie einfach die “bad8d5e”-Übergabezeile und speichern. git wird dann Ihren Verlauf neu schreiben und die 2. Interaktive Rebase ist SEHR mächtig!

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

1
1
1
2012-10-12 09:23:13 +0000
git checkout <treeish> -- /path/to/dir

Das bringt das Verzeichnis aus dem angegebenen “treeish” für den /pfad/to/dir zurück

1
1
1
2012-02-28 20:17:27 +0000
git reset --hard {ref}

ist die einzige Möglichkeit, einen Commit rückgängig zu machen, wenn es nur einen weiteren Commit im Repo gibt (z.B. erster Commit und 1 weiterer). Die restlichen Möglichkeiten (revert, rebase) funktionieren nicht, zumindest ab git 1.7.5.1.

Wenn Sie der git reset mit einer git gc folgen, dann wird git tatsächlich die alten Commit-Daten vollständig aus dem Repo löschen.

0
0
0
2014-06-13 00:08:14 +0000

Ich bekam dies zum Laufen, indem ich die Hash-Codes der letzten Übertragungen von HEAD-Dateien innerhalb des Repository-Ordners manuell editierte:

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

Davor war ich nie in der Lage, die UNMERGE-Operationen, die ich lokal durchführte, zu veranlassen. Es hieß immer wieder, es sei “fehlgeschlagen, einige Refs” an das Central Repository zu pushen.