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、はてぶでお待ちしております。
カテゴリ:
Git