git rebase で x(exec) を使うと捗りました。
squash しつつ edit
例えば次のようなリベースで 002 と 003 を squash しつつ edit したいとき。
pick d94123a 001
pick d9b3511 002
pick b3f6c3e 003
pick 3a76981 004
普通にやると次のように squash したあとで、
pick d94123a 001
pick d9b3511 002
s b3f6c3e 003
pick 3a76981 004
もう一回リベースして edit する必要があります。
pick d94123a 001
e 20e1401 002+003
pick 72b2cdc 004
ので、2回に分けてリベースする必要がありますが・・・次のように squash のあとに x(exec) で false などの適当な失敗するコマンドを実行すると、そこでリベースが中断されるので、1回のリベースで squash と edit が同時にできます。
pick d94123a 001
pick d9b3511 002
s b3f6c3e 003
x false
pick 3a76981 004
コミットを分割
次のようなリベースで 002 のコミットを分割したいとき。
pick 34f4f48 001
pick 548ac76 002
pick 94cdb81 003
普通にやると次のように edit し、ワーキングツリーを弄って git commit --amend とか、git reset @^ からの git commit -ap とかかと思うんですけど・・・
pick 34f4f48 001
e 548ac76 002
pick 94cdb81 003
分割するコミットの行を削除して、代わりに下記のように分割したい数だけ追記します。
pick 34f4f48 001
x git checkout -p 548ac76 && git commit -c 548ac76
x git checkout -p 548ac76 && git commit -c 548ac76
x git checkout -p 548ac76 && git commit -c 548ac76
pick 94cdb81 003
x git checkout -p ... の段階で git add -p のようなインタラクティブな差分の追加のプロンプトが表示されるので、分割したいコミットになるように差分を修正します。
次の git commit -c ... で、元のコミットメッセージがデフォルトで入った状態でコミットメッセージが入力できます。
手順は若干異なりますが、次のようにできます。
さいごに
最近 Windows での Git を TortoiseGit からコマンドラインに乗り換え?たのですが、プッシュ前にコミットを綺麗にするためにリベースする作業がコマンドラインだと辛いなーと思ってました。
TortoiseGit なら、滅茶苦茶遅いしたまに謎の原因でリベースがコケたり、していたのですがグラフィカルに操作できて便利なので、リベースするときだけたまに TortoiseGit 使ったりしてました(コミットの入れ替えや reword や squash ぐらいならコマンドラインでも十分ですが・・)。
がしかし、リベースで x(exec) を使うようにしてみたところ、わりとコマンドラインだけでなんとかなる気がしてきました。
