Git超入門 - 猿でもできるGit rebase

むちゃくちゃわかりやすい例を考えてみた

今あなたは、羊を数えるプロジェクトをGitで開始しました。
羊を1匹数えるごとに1コミットして、3コミットまで終わりました。
ひつじが1ぴき (←1コミット目)

ひつじが2ひき (←2コミット目)

ひつじが3ひき (←3コミット目)
masterブランチの歴史
(左から右に進みます)
1ぴき 2ひき 3ひき
○ - ○ - ○
ワイルドプログラマ、wildブランチを作る
ここで突然ワイルドプログラマのスギちゃんが登場します。
スギちゃんは、masterブランチをもとにwildブランチを作成して、そこで1コミットずつ発言をワイルドに変えてしまいました。
ひつじが1ぴきだぜぃ

ひつじが2ひきだぜぃ

ひつじが3ひきだぜぃ
wildブランチの歴史
(左から右に進みます)
1ぴき 2ひき 3ひき 1ワイルド 2ワイルド 3ワイルド 
○ - ○ - ○ -  -  - 
しかしmasterは勝手に進む
スギちゃんは早まったのです。
実は、羊は全部で5匹いるのです。
あなたはスギちゃんの作業には知らんぷりで、淡々とmasterブランチで羊を数える作業を進めてしまいました。
ひつじが1ぴき

ひつじが2ひき

ひつじが3ひき

ひつじが4ひき

ひつじが5ひき
masterブランチの歴史
(左から右に進みます)
1ぴき 2ひき 3ひき 4ひき 5ひき
○ - ○ - ○ - ○ - ○
スギちゃんは、4匹目と5匹目もワイルド化したい。さてどうする?
さあスギちゃんはうろたえました。
masterで追加された4匹目と5匹目を、自分のwildブランチに取り込まなければなりません。
残念なマージ
ここでもしスギちゃんがあわてて普通のmergeをしたら、残念な感じになります。
git checkout wild
git merge master
こうすると、2つの歴史の流れが1つに合体します。
1ぴき 2ひき 3ひき 4ひき 5ひき
○ - ○ - ○ - ○ - ○ -- 
         \           \
           -  -  - ○
         1ワイルド 2ワイルド 3ワイルド 
しかし、歴史がこのように途中で分岐していると、後からプロジェクトに参加した人が混乱します。
また、コミットログが残念な感じになります。
残念なコミットログ


rebaseで歴史が一本化される

やはりスギちゃんには男らしく、羊が5匹全部登場した後で一気にワイルド化をやってほしいものです。
そんなときに使えるのがrebaseです。
git checkout wild
git rebase master
すると、次のような処理が行われます。
  • 一度ワイルド化コミットが全部取消しにされる(3匹目追加の直後の状態に戻る)
  • masterブランチの残りのコミットが、次々とカレントブランチにコミットされる
  • 最後に、ワイルド化コミットが次々とカレントブランチにコミットされる
rebase後のwild歴史
1ぴき 2ひき 3ひき 4ひき 5ひき1ワイルド 2ワイルド 3ワイルド
○ - ○ - ○ - ○ - ○ -  -  - 
コミットログもいい感じになりました。

このあとスギちゃんが4匹目と5匹目をワイルド化コミットすれば、ワイルド化の歴史はmasterの後ろにきれいに並びます。
1ぴき 2ひき 3ひき 4ひき 5ひき1ワイルド 2ワイルド 3ワイルド 4ワイルド 5ワイルド
○ - ○ - ○ - ○ - ○ -  -  -  -  - 

あなたもやってみよう!

マージ直前のものをGithubに置いておきました。
https://github.com/DQNEO/RebaseMe
実際にforkして、スギちゃんの代わりにrebaseしてあげましょう!

ご意見・ご感想をTwitter、はてぶでお待ちしております。
カテゴリ: