Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

ngyuki
テック系男子。 ただのやってみた系の記事ははてなブログに、それ以外の技術系のネタは Qiita に投稿します。
https://ngyuki.jp/
headjapan
中規模~大規模の安定した基幹システム・大規模サイトの分析・要件定義・設計・開発を得意とする、総合的な開発会社です。
http://www.headjapan.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした