Vor ein paar Wochen (dh vor vielen Commits) habe ich einen Git-Commit gemacht, der viele Dateien berührte. Die meisten Commitments waren großartig.
Ich möchte jetzt jedoch die Änderungen rückgängig machen, die ich nur an einer dieser Dateien vorgenommen habe, aber ich möchte keine Änderungen überschreiben, die an dieser Datei vorgenommen wurden nach das begehen.
Gibt es eine Möglichkeit für mich, einen bestimmten Commit rückgängig zu machen, aber nur für eine der Dateien in diesem Commit?
Holen Sie sich ein Patch-bereites Diff für diese Datei in diesem Commit und wenden Sie dann den Patch rückgängig an:
git show <commit-id> -- <path> | git apply -R -
Stellen Sie sicher, dass Ihnen das Ergebnis gefällt, und wenn ja, fügen Sie es hinzu und bestätigen Sie es mit der entsprechenden Nachricht.
Toreks Antwort ist definitiv besser (und einfacher!), aber der Vollständigkeit halber wollte ich diesem Problem ein paar alternative (einige naive) Lösungen hinzufügen.
Lösung 1: Reverse Patch (naiv, verglichen mit Toreks Lösung)
Dies ist der Lösung von Torek sehr ähnlich. Um die Änderungen an einer bestimmten Datei rückgängig zu machen, die von einem bestimmten Commit vorgenommen wurden, erhalten Sie einfach ein umgekehrtes Diff dieses Commits, indem Sie die Argumente auf umkehren git diff
:
git diff <commit> <commit>^ -- <filepath> | git apply
Normalerweise werden die Änderungen durch eingeführt <commit>
verwenden Sie die Bestellung
git diff <commit>^ <commit>
aber wenn Sie die Reihenfolge umkehren, erhalten Sie am Ende die Umkehrung dieser Änderungen, was ein gültiges Diff ist, das als Patch verwendet werden kann!
Lösung 2: Alle Dateien zurücksetzen, dann Änderungen nur an bestimmten Dateien festschreiben (sehr naiv)
Eine naivere Lösung wäre, den Commit rückgängig zu machen, der die Änderungen hinzugefügt hat, die Sie rückgängig machen möchten, aber die Rückgängigmachung nicht zu committen. Entfernen Sie dann einfach alle Änderungen an den anderen Dateien aus dem Index und der Arbeitskopie:
git revert --no-commit <commit>
# Unstage all changes that revert all files
git reset -- .
# Stage and commit just the reversion changes that you want
git add <yourFile>
git commit -m "Revert changes to <yourFile> from <commit>"
# Undo all reversions changes to the other files
git checkout -- .
Dies ist notwendig, weil git revert
macht keine Änderungen an einzelnen Dateien rückgängig, es werden derzeit nur ganze Commits rückgängig gemacht.
Verwandt, aber kein Duplikat (glaube ich): Zurücksetzen einer einzelnen Datei auf eine frühere Version in Git.
– Benutzer456814
30. Mai 2014 um 4:50 Uhr
Siehe auch Wie kann ich eine bestimmte Datei mit Git auf eine bestimmte Revision zurücksetzen/zurücksetzen?.
– Benutzer456814
30. Mai 2014 um 4:53 Uhr