Gitメーリングリストでこれを行う方法を見つけました。
git show <commit> -- <path> | git apply --reverse
出典:http : //git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html#a6064406
バリエーション
パッチが適切に適用されない場合、そのコマンドは失敗します(変更は発生しません)が、--3way代わりに競合が発生し、手動で解決できます(この場合、Caseyの答えがより実用的かもしれません)。
git show <commit> -- <path> | git apply --reverse --3way
これを使用して、複数のコミットを部分的に元に戻すこともできます。例:
git log -S<string> --patch | git apply --reverse
<string>コミットで一致する変更を含むファイルを元に戻します。これはまさに私のユースケースで必要なものです(いくつかの個別のコミットにより、別のファイルに同様の変更が導入され、他のファイルも無関係に変更したため、元に戻したくありませんでした)。
にdiff.noprefix=true設定している場合は、コマンド~/.gitconfigに追加-p0する必要がありますgit apply。たとえば、
git show <commit> -- <path> | git apply -p0 --reverse