Rebaseとトピックブランチ
Gitのリベース(Rebase)機能がようやく分かったのでメモ。
MercurialのMQは、GitのRebase機能を実現する重要な機能だ。
【元ネタ】
git rebaseって超便利じゃね? - Seasons.NET
Gitを使いこなすための20のコマンド - SourceForge.JP Magazine : オープンソースの話題満載
Mercurial: "Managing change with Mercurial Queues" を読む(3) | Inside ASCADE
Mercurialではじめる分散構成管理:第6回 勝手に「分散構成管理」 ~非Mercurial環境との共存|gihyo.jp … 技術評論社
4.6. コミット ― TortoiseHg v0.8.2 documentation
Subversion ユーザーが Git を使ってみた (基本操作編) - まちゅダイアリー(2010-05-06)
「入門Mercurial Linux/Windows対応」によると、リベースとは「ベースとなるソースを更新する」意味。
「入門Git」では、216頁の図13-1.トピックのリベースで詳しく解説されている。
トピックブランチは、タスクブランチの一種で、一つのテーマに関してだけ修正や機能追加を試みるブランチ。
GitやMercurialなどの分散バージョン管理で多用されるブランチだ。
トピックブランチの利点は、メインライン(trunk)に中途半端なソース修正をコミットしないことと、トピックブランチでメインラインと無関係に自由に実験出来ること。
前者の利点は、メインラインが常時リリース可能な品質を保証できるし、後者の利点は、パッチやハックを自由に行って、実験できることにある。
しかし、メインラインでどんどん機能追加されていって、トピックブランチのソースが古くなった場合、どこかの時点で、トピックブランチへtrunkからPullしなくてはならない。
「入門Git」によれば、トピックブランチへtrunkからPullするのは初心者が陥りやすいミスだと言う。
何故なら、trunkからマージされると、せっかくトピックブランチで育んだパッチが動かなくなるからだ。
だから、trunkからトピックブランチへのマージは、Rebaseが推奨されている。
Rebaseの仕組みは、トピックブランチのパッチを作り、更にtrunkの最新リビジョンから新規ブランチを作り、その新規ブランチへトピックブランチのパッチをマージすること。
つまり、Rebaseとは「ベースとなるソースを更新する」意味で文字通り、トピックブランチ→trunkへマージ作業が行われて、メインライン(ベースとなるソース)が更新される。
Rebaseによってコンフリクトが起きたり、動作しなくなったとしても、コミット履歴はtrunkへトピックブランチのパッチが当てられたことで残るので、その後の改修がやりやすくなる。
逆に、trunk→トピックブランチへPull(実際はmerge)すると、トピックブランチのパッチが動作しなくなってしまう危険性が高い。
コミット履歴は、トピックブランチへtrunkの機能がマージされたことが残るので、パッチの部分が分かりにくくなる。
GitがMercurialよりも優れている利点の一つが、Rebaseを使ってトピックブランチにturnkの新機能を追加しながら、トピックブランチを育てることが簡単なことにある。
最新版のMercurialでも、MQの機能がRebaseの機能を代用してくれるので、Rebaseを実施しやすくなった。
TorotiseHgでも、MQの設定をすれば、Rebaseが使える。
※注意:Mercurialでもrebaseコマンドがあり、Gitと同等な機能になっている。
分散バージョン管理の最大の利点である自動マージ機能は、トピックブランチの品質向上に大きく寄与してくれる。
トピックブランチのワークフローはバグ修正のそれと全く同じなので、システムテストや受入テストなどリリース直前のテスト管理や品質管理で大きな威力を発揮するだろうと思う。
最後に、「入門Git」は分散バージョン管理を使いこなす上で最もお勧めの書籍だ。
特にトピックブランチとRebaseの関係について詳しく説明している13章「リモートリポジトリ定義」と、OSSで主流のワークフローであるパッチ作業について説明している10章「パッチベースのワークフロー」は、非常に重要だ。
「入門Mercurial Linux/Windows対応」にも12章「ソースアーカイブベースの勝手Mercurial化」で、MercurialのRebase作業について書かれているので要注意。
【補注】
objectxさんのコメント通り、Mercurialのextensionでrebaseコマンドが使えるようになっている。
tortoisehgならば、mecurial.iniへ
[extensions]
rebase =
を設定するだけでいい。
| 固定リンク
「廃止Mercurial」カテゴリの記事
- GitHubはオープンソースのプロセスを標準化した(2015.06.11)
- 「反復型ソフトウェア開発」はソフトウェア工学の良書(2013.02.09)
- Mercurialに取り込まれたコミュニティ由来の機能一覧(2013.01.12)
- WordやExcelから直接Mercurialへコミットできるアドオンmsofficehg(2012.12.07)
- RedmineでSubversion リポジトリ表示を高速化する方法(2012.11.23)
「構成管理・Git」カテゴリの記事
- 「GitLabに学ぶ 世界最先端のリモート組織のつくりかた」の感想(2023.12.10)
- パッケージ設計の原則の意義は変化しているのか(2023.09.30)
- 小説活動にプルリクエスト駆動が必要になってきた(2022.05.08)
- 【資料公開】チケット駆動開発の解説~タスク管理からプロセス改善へ #redmine(2022.01.14)
- プログラミングしてる時はでっかいピタゴラ装置を作ってるみたいな感じ(2022.01.09)
コメント
既に誰かが報告しているかもしれませんが
http://mercurial.selenic.com/wiki/RebaseExtension
1.1 から rebase 出来る様になっています。extension 扱いですが hg に同梱です。
投稿: objectx | 2010/06/27 22:21
objectx さん、コメントありがとうございました。
追記しておきました。
投稿: あきぴー | 2010/06/27 23:03