3

私は HG から Plastic SCM ( http://www.plasticscm.com、主に VS 統合がはるかに優れているように思われるため) に切り替えることを検討しており、「タスク駆動型分岐」、つまりすべてのメインラインからの分岐を促進しています。特徴。これは理にかなっていますが、いくつか質問がありました。

  1. 彼らは、完了後にタスクをメインラインにマージしないことを推奨しています。これは非常に直感的ではないように思えます。テスト後、後でリベースする必要がないように、すぐにマージしてチップに戻したいと思うでしょう。言うまでもなく、タスクがマージバックされず、新しいリリースが近づいていると言う場合、おそらく数百の異なるブランチをマージし、それらすべてが短期間で互いにうまく機能することを確認する必要があります (テスト独立しているということは、彼らが他の人と仲良くするという意味ではありません。だから、これは失敗するに違いないように思えますが、間違っていますか? この方法を実践していますか?
  2. 次のシナリオを考えると、上記について私が間違っているとしましょう: タスク A、B、C。B、C が A の完了に依存している場合、A を完了し、それをメインラインにマージしてから、次にマージする方がよいでしょうか?そこから分岐して B/C で作業するか、最初の分岐 (A 用に作成した分岐) をサブ分岐します。それは可能ですか?おすすめされた?同じ人が A、B、C を実装している場合、私の頭の中では少しすっきりしているように思えます。

皆さんの考えを教えてください!

ありがとう。

4

2 に答える 2

2

最近行われたブランチ戦略に関するかなり良い議論の中で、jgifford25回答には、Subversion の開発者の 1 人が「アジャイル リリース戦略」と呼んでいるものへのリンクが含まれていました。トランクではなく、リリース ブランチにマージします。私はそれが良い考えだとは思いませんでしたし、これも良い考えだとは思いません。また、どちらの場合も、アイデアが SCM 開発者によって推し進められているのは偶然ではないと思います。彼らには「すべてが釘のように見える」ケースがあると思います。プロセスの問題は、より多くの方法で修正できると思います。そしてより大きなSCM。

では、なぜこの考えが悪いのでしょうか。プラスチックの連中の主張に従いましょう。このプロセスは、「メインラインを元の状態に保つ」という 1 つの中心的なアイデアに基づいて構築されています。ここまでは順調ですね。次に、次のような三段論法を進めます。

  1. 壊れたコードをトランクにチェックインすると、ビルドが壊れます
  2. 壊れたビルドは悪い
  3. したがって、コードをトランクにチェックインしないでください

これの問題は、壊れたビルドが悪い理由を完全に誤解していることです。壊れたビルド自体は悪くありませんが (開発を停止させるので役に立ちませんが)、誰かが壊れたコードをチェックインしたことを意味するので悪いです。本当の問題は壊れたコードであり、壊れたビルドではありません - 実際に損傷を引き起こす可能性があるのは壊れたコードです (ユーザー データの損失、宇宙探査機の紛失、地球規模の熱核戦争など)。

彼らの解決策は、壊れたコードを別の場所でチェックしてもらい、ビルドが壊れないようにすることです。これは明らかに、壊れたコードの実際の問題に対処するものではありません。まったく逆に、これは壊れたコードを隠す方法です。確かに、どの時点で破損が検出されるかは明確ではありません-タスクブランチがファイナライズされ、リリースブランチにマージされるとき? これは、難しい作業をリリース サイクルの後半に延期する優れた方法のように思えますが、これは非常にまずい考えです。

むしろ、本当の解決策は、壊れたコードをまったくチェックインしないことです。その目標を追求する上で、壊れたビルドは実際には良いものです。なぜなら、壊れたコードがあることがわかり、それを修正できるからです。実際、これが継続的インテグレーションの考え方の転換点です。実際にリリースされるもののプロトタイプである単一のトランクに早期にマージすることが多いため、リリースしようとしているものの問題をできるだけ早く検出します。可能。それには、「不安定なトランク」モデル、またはそれに同形のモデルが絶対に必要です。

Orangepips の回答がリンクしているブログ投稿では、このアイデアの原動力としてのプロセスに関する Ubuntu のアイデアについて言及しています。しかし、シャトルワースが実際に言ったことを見てください。

  • トランクをきれいに保つ
  • 機能の流れを維持する
  • オンデマンドでリリース

これが私が強調する最後の点ですが、これが Shuttleworth の最終目標です。彼はいつでもリリースをカットできるようにしたいと考えています。プラモデルのようにマージとテストをリリース プロセスに先延ばしするプロセスでは、これを実行することはできません。

むしろ、それを実行できるプロセスがどのようなものかを確認したい場合は、無駄のない人たちが何をしているかを見てください: 1 つのコードライン、継続的インテグレーション (数日または数週間ではなく数時間または数分のスケールで)、壊れたコードはありません.

結論として、これをしないでください。1 つのコードラインを用意し、できるだけ頻繁に作業コードをそれにチェックインします。単純。

PS では、リリース ブランチを作成して、実際のリリースを安定させ、バグ修正することをお勧めします。理想的にはそうしませんが、そうする必要があるかもしれません。

PPS また、チェックインする前に実行するには遅すぎる CI テスト スイートがある場合 (たとえば、1 時間かかる機能テスト)、DVCS でできることは、2 つのリポジトリを用意することです。クリーン リポジトリは、ダーティ リポジトリの変更を監視し、新しいバージョンをビルドしてテストし、合格した場合はクリーン リポジトリにプッシュするスクリプトによってプッシュされます。その後、クリーン リポジトリからオンデマンド リリース (QA など) を実行できます。開発者はクリーン リポジトリから更新して、開発中に最新の状態を維持できます。ただし、マージの直前にダーティ リポジトリから更新する必要があることは明らかです。

于 2010-12-30T21:52:00.830 に答える
0

PR を読んだ、トランク/メイン/ベースラインにマージする前にコードをテストするモデルを提唱しているように聞こえます(ルール 4 を参照)。これは、一連の単体テスト、それらのテストが行​​われたすべての変更をカバーすることを前提としています。私が関わってきたほとんどのプロジェクトでは、スイートは存在せず、おそらく完全には存在しません。

Subversion を使用した私自身の経験では、トランクは手付かずですが、リリースの作成元ではありません。代わりに、トランクは、バージョン間でポートがやり取りされる場所です。リリースはバージョン ブランチから取得されます。

バージョン ブランチから、機能ブランチが作成されます (場合によっては)。これらのブランチにより、問題が発生する可能性のある頻繁なコミットが可能になります。機能ブランチが完了すると、バージョンにマージされます。この統合が行われると、必然的に解決すべき問題が生じます。最後に、バージョンがビルドされて検証されると、トランクにマージされます。

なので、1番は現実的ではないと思います。#2に関しては、場合によって異なります。B と C が A を変えないことは確実に思えますか? もしそうなら、Aをマージしてから、BとCに分岐します。しかし、後者が前者を変更する可能性が高いため、Aを分岐してBとCを作成する可能性が最も高いです。次に、3つすべてをロールアップします。

于 2010-12-30T19:41:49.623 に答える