2010-02-23 1 views
562

gedrückt worden ist, was der einfachste Weg ist, eine bestimmte rückgängig zu machen begehen das heißt:Rückgängig eine bestimmte in Git verpflichten, die Remote-repos

  • nicht im Kopf oder HEAD
  • auf der Fernbedienung gedrückt wurde.

Denn wenn es nicht die neueste begehen ist,

git reset HEAD 

funktioniert nicht. Und weil es wurde zu einem entfernten geschoben,

git rebase -i 

und

git rebase --onto 

wird ein Problem in den Fernbedienungen verursachen.

Mehr noch, ich möchte nicht die Geschichte wirklich ändern. Wenn es einen schlechten Code gab, war er in der Geschichte und kann gesehen werden. Ich will es nur in der Arbeitskopie, und ich habe nichts gegen eine umgekehrte Zusammenführung.

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

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

, die durch reverse Verschmelzung alle Änderungen in diesen Revisionen als neue Commit alle Änderungen 295-302 entfernt.

die 302 Commit rückgängig macht, natürlich durch Hinzufügen eines weiteren Commits, 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 noch der Sinn von atomaren Commits?

Wir haben Staging stashing und alle, um sicherzustellen, dass die Commits perfekt atomar sind, sollten Sie nicht in der Lage sein, eine oder mehrere dieser atomaren Commits leicht rückgängig zu machen?

Antwort

877

Identifizieren Sie den Hash des Commits mit git log, und verwenden Sie dann git revert <commit>, um ein neues Commit zu erstellen, das diese Änderungen entfernt. In gewisser Weise ist git revert das Gegenteil von git cherry-pick - letzteres wendet das Patch auf einen Zweig an, der es vermisst, das erstere entfernt es aus einem Zweig, der es hat.

+174

ist und verwenden Sie die Option -n, wenn Sie möchten den Code zurück, aber nicht automatisch erneut einbinden. – jaygooby

+9

Was macht die Option "m"? Ich habe versucht, Git 8212f7d zurückzusetzen, aber habe dies stattdessen: Fehler: Commit 8213f7dad1ed546b434a0d8a64cb783b530a5a30 ist eine Zusammenführung, aber keine -m-Option wurde gegeben. fatal: Zurücksetzen fehlgeschlagen – Malcolm

+1

'git help revert' besagt, dass Sie auswählen können, von welchem ​​Elternteil der Zusammenführung Sie zurückgehen möchten. Sie können eine Zusammenführung nicht zurücksetzen, ohne ein übergeordnetes Element auszuwählen. Die Dokumentation weist Sie auf https://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt hin. –

32

Da es bereits gepusht wurde, sollten Sie den Verlauf nicht direkt manipulieren. git revert werden bestimmte Änderungen von einem Commit mit einem neuen Commit rückgängig machen, um den Commit-Verlauf nicht zu manipulieren.

266

Ich mag nicht die automatische Festschreibung, die git revert tut, so könnte dies für einige hilfreich sein.

Wenn Sie nur die geänderten Dateien wollen nicht die Auto-commit, können Sie --no-commit verwenden

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

, die die gleiche wie die -n

% git revert -n <commit hash> 
+6

Du könntest auch 'git reset HEAD ~ 1 --soft' machen, wenn du schon ohne' -n' zurückgesetzt hast. – Daniel

+1

Aber 'git reset HEAD ~ n' löst nicht das Rückgängigmachen eines Commits, das nicht kontinuierlich erreichbar ist der Kopf. Die Abfrage soll einen bestimmten Commit rückgängig machen. – sangeethkumarp