新しい Mercurial への改宗者が最初に学ぶ必要があるのは、不完全なコードをコミットすることに慣れることです。Subversion は、壊れたコードをコミットしてはならないことを教えてくれました。今こそ、その習慣を忘れる時です。頻繁にコミットすると、ワークフローの柔軟性が大幅に向上します。
私が見てhg pull --rebase
いる主な問題は、元に戻す方法がなくてもマージを中断できることです。DVCS モデルは、履歴を明示的に追跡するという考えに基づいており、リベースは、実際には同時に作業していたにもかかわらず、私の変更はすべてあなたの変更の後に行われたと言って、その考えを覆します。そして、あなたの変更が何であるかわからないため (以前の変更セットに基づいてコードを作成していたため)、あなたのコードに加えて私のコードが何かを壊さないかどうかを知ることは困難です。また、リベースによって分岐機能が失われます。これは、実際には DVCS の背後にある全体的な考え方です。
私たちのワークフロー ( Mercurial ホスティング システム全体を構築してきました) は、複数のクローン、またはブランチ リポジトリを維持することに基づいています。各開発チームまたは小規模チームには、「中央」リポジトリの単なるクローンである独自のブランチ リポジトリがあります。すべての新機能と大規模なバグ修正は、個人のブランチ リポジトリに移動します。そのコード ピアをレビューしてもらい、準備が整ったと判断されたら、それを中央レポジトリにマージできます。
これにより、いくつかのメリットが得られます。まず、私の変更はすべて「準備が整う」まで独自のリポジトリにあるため、ビルドを壊すことはありません。第二に、別の機能を実行する必要がある場合、または次のメジャー バージョンのように実行期間が長い場合は、別のブランチ リポジトリを作成できます。そして 3 つ目は、すぐに修正する必要があるバグが発生した場合に、中央リポジトリに簡単に変更を加えることができることです。
とはいえ、このワークフローを使用する方法はいくつかあります。最も単純で、私が始めたのは、個別のクローンを保持することです。website-central
、などがありますwebsite-tghw
。特に、それらの間をローカルでプッシュおよびプルできるため、うまく機能します。最近では、remotebranches拡張機能を使用してそれらを管理し、一度にすべてをプッシュしないようにhg nudgeを使用して、複数のヘッドを同じリポジトリに保持し始めました。
もちろん、このワークフローをあまり好まない人もいます。通常、Mercurial サーバーではサーバー側のクローンを作成するのが難しいためです。その場合、名前付きブランチを使用して、機能をまっすぐに保つことも検討できます。残念ながら、それらは Git ブランチほど柔軟ではありません (これが私たちがブランチ リポジトリを好む理由です) が、ブランチを閉じる方法と、ブランチを開始すると実際にそれらを取り除くことができない理由を理解すれば、うまく機能します。
これは少し長くなるので、Mercurial が (SVN を介して) 提供する優れた分岐とマージを採用することをお勧めして、最後にまとめます。確かに学習曲線はありますが、コツをつかめば、物事は本当に簡単になります。