Git
cherry-pick
revert

git cherry-pickで特定のコミットを完全取り消す

背景

ローカルでいくつかのコミットから、一つのコミットを無くしたい

$ git log -10 --oneline
84a0ea816 commit4
3259ea98b commit3
a7d8e5594 取り消したいcommit
7a1b94742 commit2
7a1b94741 commit1
7a1b94743 Merge pull request xxx(from develop)

期待する結果

$ git log -10 --oneline
84a0ea816 commit4
3259ea98b commit3
7a1b94742 commit2
7a1b94742 commit1
7a1b94743 Merge pull request xxx(from develop)

対応方法

revert

$ git revert a7d8e5594
d88adea80 Revert "xx commit"
84a0ea816 commit4
3259ea98b commit3
a7d8e5594 取り消したいcommit
7a1b94742 commit2
7a1b94742 commit1
7a1b94743 Merge pull request xxx(from develop)

ただ、これではcommitの内容を取り消しされて、コミット履歴は残ってる

cherry-pick

いい方法がなくて
developからブランチを切る
commit1,2を入れる
commit3,4を入れる

$ git co -b feature/new origin/develop
$ git cherry-pick 7a1b94743..7a1b94742
$ git cherry-pick a7d8e5594..84a0ea816

結果

$ git log -15 --oneline
84a0ea816 commit4
3259ea98b commit3
7a1b94742 commit2
7a1b94742 commit1
7a1b94743 Merge pull request xxx(from develop)

もっと簡単な方法がご存知の方はぜひコメントお願いします。(あるはず)

rebase

twitte_raruさんからコメントいただいた方法が一番良さそうです。

$ git rease -i 7a1b94743

出てきた画面で消したいcommitを消して保存する

pick 7a1b94743 Merge pull request xxx(from develop)
pick 7a1b94742 commit1
pick 7a1b94742 commit2
pick a7d8e5594 取り消したいcommit
pick 3259ea98b commit3
pick 84a0ea816 commit4

完了!一番簡単の気がします。