あまり気にしない人もいるかもしれませんが、どういったところが嬉しいのか簡単な例で説明してみたいと思います。
ストーリーはこんな感じです。
- ふたつのトピック other と topic があり、それぞれmasterから分岐した開発用統合ブランチ next にマージした
- その後、topicに大きなバグがあったとわかったので一旦next上ではrevertし、topicを作りなおしてもらうことになった
- topicの修正が終わったので再度nextにマージした
master..next間で有効なコミットは2つしかないのですが、結構複雑です。
ここで、3の続きとして、masterをリリースしたのでnextを一旦巻き戻してから再構成することにした、というストーリーを考えます。
- nextをmasterにreset --hard
- 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 件のコメント:
コメントを投稿