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?

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.


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>

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.