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