it-swarm.com.de

Wie kann ich ein Commit zurücksetzen?

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?

125
n179911

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 revert rückgängig machen, es werden jedoch weitere Commit-Nachrichten zum Verlauf hinzugefügt, was möglicherweise unerwünscht ist. Verwenden Sie den Parameter -n, um Git anzuweisen, das Zurücksetzen nicht sofort zu bestätigen. Sie können interaktiv einen Rebase durchführen 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 --hard sollte mit Vorsicht erfolgen, da es nicht rückgängig gemacht werden kann.

Das Umschreiben des Verlaufs sollte mit Sorgfalt erfolgen.

94
jtimberman

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 setze ich spät abends, wenn mir der Kaffee ausgeht, Dinge ein, die ich nicht haben sollte. Dann verbringe ich die nächsten 10 - 15 Minuten damit, zu googeln, wie ich das letzte Commit entferne. 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 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 Option --soft verwenden, mit der das Commit gelöscht wird. Alle geänderten Dateien bleiben jedoch "Zu bindende Ä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.

51
iStryker

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.

8
Peltier

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.

5
hamstar

In Bezug auf jtimbermans Kommentar zu git reset --hard, der rückgängig gemacht werden kann, ist das nicht ganz richtig. Siehe hier: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1

4
mattd

Nein, git reset --hard baf8d5e löscht das 3368e1c-Commit und HEAD befindet sich danach auf baf8d5e.

Wenn Sie das 3368e1c-Commit beibehalten und das bad8d5e-Commit löschen möchten, ist es am einfachsten, ein "git rebase -i HEAD~2" (d. H. Eine interaktive Neubasis der letzten beiden Commits) auszuführen. 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 bad8d5e Festschreibungszeile und speichern. git schreibt dann Ihren Verlauf neu und das 2. Commit ist weg.

Es gibt andere nützliche Befehle, die Sie im Commit-Nachrichten-Editor verwenden können, wie squash, edit usw. Interaktive Rebase ist SEHR mächtig!

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

4
knweiss
git reset --hard {ref}

dies 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). Der Rest der Wege (Zurücksetzen, Wiederherstellen) verweigert die Arbeit, zumindest ab GIT 1.7.5.1.

Wenn Sie dem git reset einen git gc folgen, löscht git die alten Commit-Daten vollständig aus dem Repo.

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

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

1
lokeshpahal

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

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

Zuvor konnte ich die von mir vor Ort durchgeführten UNMERGE-Operationen nie auf Origin übertragen. Es wurde immer wieder gesagt, dass es "einige Refs nicht pushen konnte".

0
Leandro M