git rebase で squash しつつ edit したりコミットを分割したりする

git rebasex(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回のリベースで squashedit が同時にできます。

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 ... で、元のコミットメッセージがデフォルトで入った状態でコミットメッセージが入力できます。

手順は若干異なりますが、次のようにできます。

20180216-git-rebase-split.gif

さいごに

最近 Windows での Git を TortoiseGit からコマンドラインに乗り換え?たのですが、プッシュ前にコミットを綺麗にするためにリベースする作業がコマンドラインだと辛いなーと思ってました。

TortoiseGit なら、滅茶苦茶遅いしたまに謎の原因でリベースがコケたり、していたのですがグラフィカルに操作できて便利なので、リベースするときだけたまに TortoiseGit 使ったりしてました(コミットの入れ替えや rewordsquash ぐらいならコマンドラインでも十分ですが・・)。

がしかし、リベースで x(exec) を使うようにしてみたところ、わりとコマンドラインだけでなんとかなる気がしてきました。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.