一つ前のコミットに統合するのはgit commit --amend -C HEAD
とかでいけるんだけど2つ以上前になるとめんどい。
Gitでちょっとした修正を2つ以上前のコミットに統合したいとき、適当な名前でコミットしてrebase -iでfixupしてるけどめんどいので一発でやりたい
— Kazuhito Hokamura (@hokaccha) 2015, 7月 14
CTO殿にautosquashを教えてもらった。
@hokaccha 僕はtigでコミットを選択したらcommit --fixupでコミットできるようにキーバインドをあてて使ってます。あとrebase -i --autosquash https://t.co/xFABtYXVFT
— yuku takahashi (@yuku_t) 2015, 7月 14
こういうやつ。
しかしrebase -i --autosquash
はエディタ立ち上がって一発でできる感じじゃないのでどうにかできないかなと思って調べたらGIT_EDITOR=:
って指定するとGitのエディタ起動する部分をそのまま保存して終了っていう動作になるらしいのでこれを使えばいけそうというのがわかった。
$ GIT_EDITOR=: git rebase -i --autosquash $COMMIT
こんな感じのaliasを作る。
[alias]
fixup = !sh -c 'COMMIT=`git rev-parse ${1:-HEAD}` && git commit --fixup=$COMMIT && GIT_EDITOR=: git rebase -i --autosquash ${COMMIT}^' -
これで変更をgit add
した状態で
$ git fixup # 一つ前(HEAD)と統合
$ git fixup HEAD^ # 二つ前と統合
$ git fixup <sha1> # 指定のコミットと統合
って感じになる。
rebaseでコンフリクトしてabortしたりするとfixupなコミットが残るけどまあそのぐらいはいいかな。