Git

さっき git push しちゃったコミットに含まれる一部のファイルだけを revert する

More than 1 year has passed since last update.

場合

*.fooだけ入れたと思ってたのに、実際は*.barも含んじゃっていた。

解決

checkoutを使う。

checkoutの例

git checkout <commit-id> -- <file1> <file2> <fileN>
# <file1> <file2> <fileN> を <commit-id> 前に戻す

例えば、さっきプッシュしちゃったコミットが対象なら

git checkout HEAD~1 -- path/to/hoge.bar

となる。

ただ、*.barとなるファイルを思ってたより多くの入れてしまったけど、手動で指定するのだるいし、*.barって簡単なパターンで絞り込めそうと考えた場合。

とりあえず全ファイル一覧は、diffを使って取り出すことができる。

diffの例

git diff --stat --name-only <commitA> <commitB>
# <commitA> 時点と <commitB> 時点で異なるファイル一覧
git diff --stat --name-only <commitA> // 多分HEADと

さっきプッシュしちゃったコミットから取りたいので、HEAD~1でOK。grepで狙ったファイルに絞る。

git diff --stat --name-only HEAD~1 | grep *.bar

あとは、xargsとかでファイル一覧をまとめてcheckoutに渡すようにすれば完了す🎉

git diff --stat --name-only HEAD~1 | grep .bar| xargs -I@ -n 100 git checkout HEAD~1 -- @