Git

Gitで2つ以上前のコミットに統合する

More than 3 years have passed since last update.

一つ前のコミットに統合するのはgit commit --amend -C HEADとかでいけるんだけど2つ以上前になるとめんどい。

CTO殿にautosquashを教えてもらった。

こういうやつ。

http://qiita.com/kyanro@github/items/818012c1b1827ed48277

しかし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なコミットが残るけどまあそのぐらいはいいかな。