2014年2月6日木曜日

Gitのコミットグラフ(歴史)を綺麗に保つ効果

Gitではコミットグラフ(歴史)を綺麗にしておきやすいという特徴があります。

あまり気にしない人もいるかもしれませんが、どういったところが嬉しいのか簡単な例で説明してみたいと思います。


ストーリーはこんな感じです。
  1. ふたつのトピック other と topic があり、それぞれmasterから分岐した開発用統合ブランチ next にマージした
  2. その後、topicに大きなバグがあったとわかったので一旦next上ではrevertし、topicを作りなおしてもらうことになった
  3. topicの修正が終わったので再度nextにマージした
これによって作成されるコミットグラフは以下のような感じになります。(わかりやすくするため、修正前のtopicに対してtopic.oldという名前でブランチを残してあります)
master..next間で有効なコミットは2つしかないのですが、結構複雑です。

ここで、3の続きとして、masterをリリースしたのでnextを一旦巻き戻してから再構成することにした、というストーリーを考えます。
  1. nextをmasterにreset --hard
  2. otherとtopicを再びnextにマージする
コマンドラインだとこんな感じになります。
% git checkout next
% git branch next.bak               # nextのバックアップを取る
% git reset --hard master           # masterにリセットして
% git merge --no-ff other           # otherをnextにマージ
% git merge topic                   # topicをnextにマージ
% git diff next.bak                 # 違いがない(なにも表示されない)ことを確認
% git branch -D next.bak            # バックアップを削除
その結果のコミットグラフは以下のようになります。
かなりスッキリしました。

git logで見た場合も、
% git log --first-parent --oneline master..next.bak
0933889 Merge branch 'topic' into next
01ff47d Revert "Merge branch 'topic' into next"
9317eb1 Merge branch 'topic' into next
06926e7 Merge branch 'other' into next
% git log --first-parent --oneline master..next
f529af4 Merge branch 'topic' into next
ea2421b Merge branch 'other' into next
のようにスッキリしています。

このリポジトリは http://pf.sourceforge.jp/gitroot/k/kt/ktateish/rewind_simple.git においてあるので clone して gitk master..next と gitk master..next.bak を比べてみてください。

このようなやり直しの歴史がいくつも発生する場合を考えると、歴史を綺麗に保つ効果も大きいと思います。

例がシンプルすぎて効果を想像しにくいかもしれませんので、気が向いたらもう少し複雑な例を作ってみたいと思います。

0 件のコメント:

コメントを投稿