Git: Wie kann man ein Commit rückgängig machen?

124

Mit SVN ist es einfach, ein Commit rückgängig zu machen, aber wie geht das mit Git?

Mot
quelle
Ich denke nicht, dass dies mit der Frage gemeint ist. Bei einer umgekehrten Zusammenführung in SVN werden auch die Änderungen vom Festschreiben in lokale Änderungen zurückgesetzt, sodass Sie sie bearbeiten und erneut festschreiben können.
Siebenschläfer

Antworten:

105

Verwenden Sie Folgendes, um ein neues Commit zu erstellen, mit dem die Änderungen eines früheren Commits rückgängig gemacht werden:

$ git revert <commit>

Es ist auch möglich, ein Commit von einem beliebigen Punkt in der Vergangenheit durch erneutes Basieren und anschließendes Zurücksetzen zu entfernen. Dies möchten Sie jedoch nicht, wenn Sie Ihre Commits bereits in ein anderes Repository verschoben haben (oder eine andere Person von Ihnen abgerufen hat). .

Ben James
quelle
31
Sie müssten wahrscheinlich eine -m <parent number>Option git revertangeben , um anzugeben, welche Änderung zurückgesetzt werden soll. Wenn Sie eine Zusammenführung von nicht veröffentlichtem Verlauf rückgängig machen möchten, verwenden Sie git reset --hard HEAD^1.
Jakub Narębski
3
Jakub: Das stimmt, wenn Sie ein Merge-Commit zurücksetzen, aber in der Subversion-Terminologie ist "Reverse-Merge" eigentlich einfach der Name für das Zurücksetzen jeglicher Art von Commit.
Ben James
4
Beachten Sie, dass die Verwendung -mbedeutet, dass eine zukünftige Zusammenführung aus dem nicht zusammengeführten Zweig nicht die Änderungen vor dieser Zusammenführung enthält! Unter schacon.github.com/git/howto/revert-a-faulty-merge.txt finden Sie geeignete Methoden zum erneuten Zusammenführen eines nicht zusammengeführten Zweigs.
Martijn Pieters
125

Um ein Zusammenführungs- Commit zurückzusetzen, müssen Sie Folgendes verwenden : git revert -m <parent number>. Um beispielsweise das zuletzt zusammengeführte Commit mit dem übergeordneten Element mit der Nummer 1 zurückzusetzen, würden Sie Folgendes verwenden:

git revert -m 1 HEAD

Um ein Zusammenführungs-Commit vor dem letzten Commit zurückzusetzen, gehen Sie wie folgt vor:

git revert -m 1 HEAD^

Verwenden Sie git show <merge commit SHA1>, um die Eltern zu sehen, die Nummerierung ist die Reihenfolge, in der sie erscheinen, zMerge: e4c54b3 4725ad2

Dokumentation zum Zusammenführen von Git: http://schacon.github.com/git/git-merge.html

Diskussion zum Zusammenführen von Git (verwirrend, aber sehr detailliert): http://schacon.github.com/git/howto/revert-a-faulty-merge.txt

Marcus Ericsson
quelle
36
Wie können Sie die dem Elternteil zugeordnete 'Nummer' erhalten? Haben Zweige eine intrinsische numerische 'ID'?
Daniyalzade
7
Verwenden Sie git show <merge commit SHA1>, um die Eltern zu sehen, die Nummerierung ist die Reihenfolge, in der sie erscheinen, zBMerge: e4c54b3 4725ad2
Supermethode
8
Beispiel: git revert -m 1 SHA1Dieser Befehl hat bei mir funktioniert, um ein Zusammenführungs-Commit zurückzusetzen, bei dem es sich um mehrere Zusammenführungs-Commits vor dem Kopf handelte und unter denen viele Commits lagen.
c.apolzon
3
Welches sind die Eltern? E4c54b3 oder 4725ad2?
Dolphin
1
Dies liefert immer noch nicht genügend Informationen darüber, wie sich die Ergebnisse von git show auf übergeordnete Nummern beziehen. Ist die "Reihenfolge, in der sie erscheinen" 1-basiert? 0-basiert? Was ist in diesem Beispiel speziell der SHA1 von Elternteil 1? e4c54b3 oder 4725ad2?
Cowlinator
4

Wenn ich dich richtig verstehe, redest du davon, a

svn merge -rn:n-1

In diesem Fall suchen Sie wahrscheinlich nach einem früheren Commit

git revert
Rudedog
quelle
0
git reset --hard HEAD^ 

Verwenden Sie den obigen Befehl, um Zusammenführungsänderungen rückgängig zu machen.

Kapil Chakravarthy
quelle
3
Dies wirft das Zusammenführungs-Commit weg, das nicht das tut, was das Originalplakat verlangt. Das OP versucht, einen umgekehrten Patch durchzuführen, um frühere Änderungen rückgängig zu machen, und nicht den Verlauf der vorherigen Änderungen insgesamt zu löschen.
-1

Wenn Sie nicht oder später festschreiben möchten (die Festschreibungsnachricht wird weiterhin für Sie vorbereitet, die Sie auch bearbeiten können):

git revert -n <commit>
rkrisztian
quelle