998 Stimmen

Einen bestimmten Commit in Git rückgängig machen, der in entfernte Repos verschoben wurde

Was ist der einfachste Weg, um eine bestimmte Übergabe rückgängig zu machen, nämlich:

  • nicht im Kopf oder HEAD
  • wurde auf die Fernbedienung übertragen.

Denn wenn es nicht die letzte Übertragung ist,

git reset HEAD

funktioniert nicht. Und weil es auf eine Fernbedienung geschoben wurde,

git rebase -i

und

git rebase --onto

wird in den Fernbedienungen einige Probleme verursachen.

Vielmehr möchte ich die Geschichte nicht wirklich verändern. Wenn es fehlerhaften Code gab, war er in der Historie vorhanden und kann gesehen werden. Ich möchte nur, dass er in der Arbeitskopie entfernt wird, und ich habe nichts gegen eine umgekehrte Zusammenführung.

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

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

der alle Änderungen von 295 bis 302 entfernt, indem er alle Änderungen in diesen Revisionen als neuen Commit rückwärts zusammenführt.

svn merge -c -302 ^/trunk

der den 302-Commit rückgängig macht, indem er natürlich einen weiteren Commit hinzufügt, der die Änderungen aus dem entsprechenden Commit rückgängig macht.

Ich dachte, dass dies ein ziemlich einfacher Vorgang in Git und ein ziemlich häufiger Anwendungsfall sein sollte. Was ist sonst der Sinn von atomaren Übertragungen?

Wir haben Inszenierungen Versteck und alles, um sicherzustellen, dass die Übertragungen perfekt atomar sind, sollte man dann nicht in der Lage sein, eine oder mehrere dieser atomaren Übertragungen einfach rückgängig zu machen?

0 Stimmen

1534voto

Andrew Aylett Punkte 37790

Identifizieren Sie den Hash der Übergabe, indem Sie git log , dann verwenden Sie git revert <commit> um einen neuen Commit zu erstellen, der diese Änderungen entfernt. In gewisser Weise, git revert ist die Umkehrung von git cherry-pick -- letzteres wendet den Patch auf einen Zweig an, in dem er fehlt, ersteres entfernt ihn aus einem Zweig, der ihn hat.

279 Stimmen

Und verwenden Sie den Schalter -n, wenn Sie den Code wiederherstellen, aber nicht automatisch wieder einbinden wollen

19 Stimmen

Was bewirkt die Option "m"? Ich habe es mit git revert 8213f7d versucht, aber stattdessen erhielt ich Folgendes: error: Commit 8213f7dad1ed546b434a0d8a64cb783b530a5a30 ist ein Merge, aber es wurde keine Option -m angegeben. fatal: revert failed

1 Stimmen

git help revert besagt, dass Sie auswählen können, zu welchem Elternteil der Verschmelzung Sie zurückkehren möchten. Sie können eine Zusammenführung nicht rückgängig machen, ohne ein übergeordnetes Element auszuwählen. Die Dokumentation verweist Sie auf kernel.org/pub/software/scm/git/docs/howto/

470voto

Mulan Punkte 117501

Ich mag die Auto-Commit-Funktion nicht, die git revert Dies könnte also für einige hilfreich sein.

Wenn Sie nur die geänderten Dateien und nicht die automatische Übergabe wollen können Sie verwenden --no-commit

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

was dasselbe ist wie die -n

% git revert -n <commit hash>

13 Stimmen

Sie könnten auch Folgendes tun git reset HEAD~1 --soft wenn Sie bereits ohne -n

6 Stimmen

Aber git reset HEAD~n keine Rückgängigmachung einer nicht durchgängig vom Kopf aus erreichbaren Übergabe lösen. Die Anfrage ist, einen bestimmten Commit rückgängig zu machen.

0 Stimmen

Ich habe diese Lösung verwendet, bin aber in der Mitte der Umstellung auf einen Konflikt gestoßen. Nachdem ich den Konflikt gelöst hatte, habe ich git revert --continue wie sie mich angewiesen hat. Es hat funktioniert, aber leider waren die Ergebnisse nicht zufriedenstellend. Vielleicht musste ich Folgendes tun git revert --no-commit --continue .

48voto

moatPylon Punkte 2053

Da sie bereits verschoben wurde, sollten Sie die Geschichte nicht direkt manipulieren. git revert macht bestimmte Änderungen eines Commits durch einen neuen Commit rückgängig, um die Commit-Historie nicht zu manipulieren.

15voto

Meysam Sadeghi Punkte 988

Wenn der Commit, den Sie rückgängig machen wollen, ein zusammengefasster Commit ist (bereits zusammengeführt wurde), dann sollten Sie entweder -m 1 o -m 2 Option wie unten gezeigt. Dadurch weiß git, welcher übergeordnete Commit des zusammengeführten Commits verwendet werden soll. Weitere Details finden Sie unter HIER .

  • git revert <commit> -m 1
  • git revert <commit> -m 2

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X