Änderungen an einer bestimmten Datei von einem bestimmten Commit zurücksetzen

Lesezeit: 3 Minuten

Ryans Benutzeravatar
Ryan

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?

  • 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

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.

  • danke aber das ist fehlgeschlagen mit: error: <myFileName>: patch does not apply

    – Ryan

    29. Mai 2014 um 23:30 Uhr

  • Das impliziert, dass sich seitdem etwas an den Änderungen geändert hat, dh es gibt einen Konflikt. Sie können entweder: versuchen, hinzuzufügen -3 (aka --3way), um die Merge-Mechanismen von git zu verwenden; oder hinzufügen --reject (in beiden Fällen zum git apply Optionen), aber Sie müssen die Konflikte dann manuell lösen.

    – Torek

    29. Mai 2014 um 23:35 Uhr

  • Ich möchte nur darauf hinweisen, dass der naive Weg, einen Reverse-Patch zu bekommen, darin besteht, es einfach zu tun git diff <commit> <commit>^ -- <path> | git applyaber ich wusste nicht, dass Sie einfach verwenden können git apply --reverse, das ist auf jeden Fall genial! Warum tut git apply -R - Haben Sie diesen letzten Bindestrich am Ende?

    Benutzer456814

    30. Mai 2014 um 4:30 Uhr

  • @Cupcake: git apply will einen Dateinamen nehmen; Dokumentation sagt - can be used to read from the standard input. War mir nicht sofort sicher, ob es stdin lesen würde (ich habe es immer mit Dateien gefüttert, zumindest soweit ich mich erinnern kann).

    – Torek

    30. Mai 2014 um 4:35 Uhr

  • Vielen Dank! ich benutzte git show <commit-id> -- <path> | git apply -3 -R -

    – Ryan

    30. Mai 2014 um 14:16 Uhr

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.

1439260cookie-checkÄnderungen an einer bestimmten Datei von einem bestimmten Commit zurücksetzen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy