8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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) を使うようにしてみたところ、わりとコマンドラインだけでなんとかなる気がしてきました。

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?