Machen Sie ein bestimmtes Commit in Git rückgängig, das auf Remote-Repos übertragen wurde

788

Was ist der einfachste Weg, um ein bestimmtes Commit rückgängig zu machen:

  • nicht im Kopf oder im Kopf
  • Wurde auf die Fernbedienung geschoben.

Denn wenn es nicht das letzte Commit ist,

git reset HEAD

funktioniert nicht Und weil es auf eine Fernbedienung geschoben wurde,

git rebase -i

und

git rebase --onto

wird ein Problem in den Fernbedienungen verursachen.

Mehr noch, ich möchte den Verlauf nicht wirklich ändern. Wenn es schlechten Code gab, war er in der Geschichte vorhanden und kann gesehen werden. Ich möchte es nur in der Arbeitskopie haben, und es macht mir nichts aus, ein Reverse Merge Commit durchzuführen.

Mit anderen Worten, was ist das Git- Äquivalent der folgenden svn-Befehle:

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk

Dadurch werden alle Änderungen von 295 auf 302 entfernt, indem alle Änderungen in diesen Revisionen als neues Commit rückgängig gemacht werden.

svn merge -c -302 ^/trunk

Dies macht das 302-Commit natürlich rückgängig, indem ein weiteres Commit hinzugefügt wird, das die Änderungen von diesem jeweiligen Commit rückgängig macht.

Ich dachte, es sollte eine ziemlich einfache Operation in Git und ein ziemlich häufiger Anwendungsfall sein. Was ist der Sinn von Atomic Commits?

Wir haben Staging Stashing und alles, um sicherzustellen, dass die Commits perfekt atomar sind. Sollten Sie nicht in der Lage sein, eines oder mehrere dieser atomaren Commits einfach rückgängig zu machen?

Lakshman Prasad
quelle

Antworten:

1210

Identifizieren Sie den Hash des Commits mit git logund git revert <commit>erstellen Sie dann ein neues Commit, mit dem diese Änderungen entfernt werden. In gewisser Weise git revertist das Gegenteil von git cherry-pick- der letztere wendet den Patch auf einen Zweig an, dem er fehlt, der erstere entfernt ihn aus einem Zweig, der ihn hat.

Andrew Aylett
quelle
237
Und verwenden Sie den Schalter -n, wenn Sie den Code zurückhaben möchten, aber nicht automatisch erneut
festgeschrieben
17
Was macht die Option "m"? Ich habe versucht, git revert 8213f7d zu verwenden, habe aber stattdessen Folgendes erhalten: Fehler: Commit 8213f7dad1ed546b434a0d8a64cb783b530a5a30 ist eine Zusammenführung, aber es wurde keine Option -m angegeben. tödlich: Zurücksetzen fehlgeschlagen
Malcolm
10
Um eine Zusammenführung
rückgängig zu machen
31
Eine Warnung an alle, die eine Zusammenführung rückgängig machen möchten: git revert macht alle Datenänderungen rückgängig (dh die Dateiänderungen werden zurückgesetzt), aber die Zusammenführung bleibt weiterhin im Verlauf. Wenn Sie versuchen, denselben Zweig später erneut zusammenzuführen, werden daher vor dem erneuten Zusammenführen keine Commits aus dem zusammengeführten Zweig enthalten. Dies ist höchstwahrscheinlich nicht das, was Sie wollen. Um den Zweig wieder vollständig zusammenzuführen, müssen Sie zuerst das Commit zurücksetzen, wo Sie die ursprüngliche Zusammenführung zurückgesetzt haben. Erfahren Sie hier mehr: kernel.mirrors.pair.com/pub/software/scm/git/docs/howto/…
etreworgy
3
Der Link im Kommentar von @etreworgy ist 404. Ich vermute, dies ist eine aktuelle Version des Links: kernel.org/pub/software/scm/git/docs/howto/…
Tim Smith
368

Ich mag das automatische Festschreiben git revertnicht, daher könnte dies für einige hilfreich sein.

Wenn Sie nur möchten, dass die geänderten Dateien nicht automatisch festgeschrieben werden , können Sie sie verwenden--no-commit

% git revert --no-commit <commit hash>

das ist das gleiche wie das -n

% git revert -n <commit hash>
Vielen Dank
quelle
9
Sie könnten auch tun, git reset HEAD~1 --softwenn Sie bereits ohne-n
Daniel
1
Löst git reset HEAD~naber nicht das Rückgängigmachen von Commits, die nicht ständig vom Kopf aus erreichbar sind. Die Abfrage besteht darin, ein bestimmtes Commit zurückzusetzen.
Sangeethkumarp
Ich habe diese Lösung verwendet, bin aber mitten in der Rückkehr auf einen Konflikt gestoßen. Nachdem ich den Konflikt gelöst hatte, tat ich, was git revert --continuees mir befohlen hatte. Es hat funktioniert, aber leider die Ergebnisse verpflichtet. Vielleicht musste ich tun git revert --no-commit --continue.
Mareoraft
1
@sangeethkumarp der Kommentar von Daniel ist ein zusätzlicher Schritt, den Sie nach dem machen können git revert, wenn Sie das vergessen haben -n; Da zu diesem Zeitpunkt das letzte Festschreiben die Umkehrung ist, macht das Soft-Reset das Festschreiben rückgängig, jedoch nicht die damit verbundenen Codeänderungen des Zurücksetzens
Oliver
@ Daniel lieferte Lösungen durch Kommentararbeit für mich Vielen Dank '' git reset HEAD ~ 1 --soft ''
Md. Abu Sayed
41

Da es bereits gepusht wurde, sollten Sie den Verlauf nicht direkt manipulieren. git revertSetzt bestimmte Änderungen aus einem Commit mithilfe eines neuen Commits zurück, um den Commit-Verlauf nicht zu manipulieren.

WassergrabenPylon
quelle
1

Wenn es sich bei dem Commit, das Sie zurücksetzen möchten, um ein zusammengeführtes Commit handelt (das bereits zusammengeführt wurde), sollten Sie entweder -m 1oder eine -m 2Option wie unten gezeigt verwenden. Dadurch wird git darüber informiert, welches übergeordnete Commit des zusammengeführten Commits verwendet werden soll. Weitere Details finden Sie HIER .

  • git revert <commit> -m 1
  • git revert <commit> -m 2
Meysam Sadeghi
quelle