web-dev-qa-db-ja.com

このGitブランチモデルに問題はありますか?

これについて git分岐モデル またはワークフローについて質問しています。私は本当にこれが好きです。それは私に非常に直感的で生産的な印象を与えますが、私が求めているのは、(ClearCaseがその日を支配していた別の世界から来た)私にはまだ明らかではないこのアプローチに欠陥や欠点があるかどうかです。

(あなたが役立つことができるものは何でも、すべての質問に答える必要はありません)

  1. これまたは同様のgit分岐ワークフローを使用していますか?

  2. これは生産的なアプローチだと思いますか?

  3. このアプローチに欠陥はありますか?潜在的な欠点はありますか?

  4. より良いアプローチがある場合は、それについて共有したり、それに関する記事やディスカッションへのリンクを提供したりしませんか?

10
Todd Hopkinson

ほとんどの場合、これはこれまでに使用したすべてのVCSで採用されている通常のワークフローです。一部の(CVS、SVN)の場合は、GITを使用するのは簡単です。とは言っても、私は2つの発言があります。

まず、機能ブランチに関しては2つの考え方があります。

  1. それらをマージ
  2. それらをリベース

(1)は記事が示唆しているようです。マージコミットの問題は、いわゆる Evil Merges です。具体的には、関数の1つが分岐の1つでセマンティクスを変更した開発パスを結合するものですが、自動マージは、他の分岐からのコード内のすべての出現箇所にパッチを適用できません。この方法で導入された回帰は、デバッグが難しいことで有名です。 GITユーザーは、自動的に原因を見つけるgit bisectがあるため、通常、回帰についてはるかにリラックスできます。ただし、説明されている状況では、git bisectはマージコミットを指摘するため、まったく役に立ちません。

(2)履歴をできるだけ線形に維持することで、この問題を回避します。それらの反対するリベースは、それがリベースの前に行った可能性のあるテストを無効にすることを主張しています。

個人的には、私はしっかりとキャンプ(2)に参加しています。git bisectの結果の妥当性は、テストカバレッジの潜在的な損失よりも高く評価されます。

第二に、開発者の間でプッシュすることはめったにないことだと私は決めました。誰もがsshを使ってボックスにフェッチしたり、ローカルでgit-deamonを実行したりすることにはセキュリティ上の問題があり、さらに重要なことに、極端に小さくないチームでは、見落としがかなり急速に失われる可能性があります。

そうは言っても、ステージングリポジトリ(scratchと呼ばれることもあります)に賛成です。これにより、サブチームは進行中の作業を共有できますただし、メインサーバーとは異なる中央サーバーを介して(パブリックでない場合でも、多くの場合、外向き)。通常、各サブチームは1つのトピックブランチを維持し、CIシステムは定期的に octopus merges すべてのトピックブランチを1つの大きな統合ブランチに実行し、競合とビルドエラーについて不平を言います。

6
mmutz

他のチームメンバーが引き続き新しい機能に取り組んでいるため、私は現在、大規模で長時間のリファクタリング(アプリケーションをあるGUIツールキットから別のGUIツールキットに変換する)を実行し、成功したリベース中心のワークフローを実行しています。

主に2つのメインブランチがあります。新機能が開発されるmastertoolkit-conversionブランチです。最も重要なルールは単純です。変換に関連するtoolkit-conversionブランチの処理のみを実行します。 master(古いGUIツールキット)で実行できる処理がある場合はいつでも、そこで実行し、toolkit-conversionの変更を新しいmasterヘッドにリベースします。もう1つのルールは、toolkit-conversionブランチをかなり短くすることです。したがって、私はよく、reset、cherry-pick、およびamend-commitとリベースを使用して、小さいコミットを大きいコミット(最後に同じ目的を持っているもの)に属するものを接着します。これは、変更を「元に戻す」のにうまくいかなかったものを試したり、一時的なヘルパーコードを使用して一部のコードをリファクタリングした後にも正常に機能します。

masterinto toolkit-conversionブランチからの変更をマージしないことを決定しました。ブランチをクリーンでレビューしやすくするために以前のコミットをリベースすることが非常に難しくなるためです。また、マージによって競合が発生する可能性があり、その解決策は、履歴をクリーンに保つ場合ほど明確ではありません。

もちろん、このワークフローには欠点もあります。最も重要なのは、それが一人のためにのみうまくいくということです。 masterの先頭に再配置した後、toolkit-conversionブランチを強制的にプッシュすると、別のリポジトリでのプルが困難になります(追跡ブランチに自動的にリベースすると、競合が発生して失敗することがよくあります)。

最後に、私のtoolkit-conversionブランチは短く、クリーンでレビューしやすいままです。たとえば、SVNでこれと同様の強力なことをしているとは思えませんでした。

2
Mike L.

私が現在取り組んでいる会社では、この同じ分岐モデルのバリエーションをしばらく適用しています。また、スクラムを使用しているため、ストーリーごとのワークフローワークフローを実行しています。

これまでに発生した唯一の問題は、チームが十分に大きく、複数のストーリーを開始でき、それらのストーリーが相互に依存している場合で、ブランチ間の変更をマージしてマスターに戻すのは一種の混乱になります。

その上、これは信頼できることが証明されています:)。

2
Edgar Gonzalez

私は現在、このワークフローの適応に忙しい。 gitが優れている分岐モデルを使用しているため、これは非常に良いワークフローだと思います。

唯一の小さな欠点は、このワークフローを維持するのにある程度の規律が必要であり、ショートカットをとらないことです。

kohana の開発者もこのワークフローを使用しており、かなり気に入っているようです。

1
Ikke

これまたは同様のgit分岐ワークフローを使用していますか?

職場でも同様のワークフローを使用しますが、少し複雑ではありません。ただし、この記事を何度も読んだことがあるので、このワークフローに大きく影響を受けています。私は私の枝の横に色で印刷された分岐モデルのpdfさえ持っています:)

これは生産的なアプローチだと思いますか?

生産的。生産性をどのように定義しますか?まあ、私の心の中で、少なくとも常により良い品質を試し、達成することは、高品質であることが最も重要です。常にプロセスなどを改善します。高品質のコードを作成できれば、生産性はその恩恵を受けます。だから問題は本当に:これはソフトウェアの品質を向上させますか?そして、それに対する私の答えは間違いなくイエスです。

このタイプの分岐モデルで最も気に入っているのは、品質の異なるレイヤーで分岐を導入することです。画像の右側にあるほど、安定性と品質が高くなります。マスターブランチは神聖であり、それに対するすべてのコミットはソフトウェアの安定したバージョンと見なされるべきです。左側に行くほど、実験的で安定性が低下します。

新しい機能とバグ修正をテストしたらすぐに、それらを左から右へ徐々に転送し、コードが要求する品質要件を満たしていることがわかっている場合に、高品質のコードを正確に移動できます。まあ、少なくとも理論的には、すべてを100%までテストすることはできず、コードには常にバグがあるため、コードにバグが含まれていないことを確認できます。しかし、それはあなたが高い信頼を保つことを可能にします。

プログラマーとしては、誰もコードに自信がないシステムで作業するよりも、何も悪いことはしません。

このアプローチに欠陥はありますか?潜在的な欠点はありますか?

組織のニーズにうまく適合するように、ブランチモデルをよく検討することが重要です。このモデルが一部の人に適しているからといって、必ずしも他の人にとって最適または望ましいというわけではありません。

常にトレードオフがあり、この場合でもです。トレードオフの1つは、ブランチの数と複雑さです。多くの異なるブランチタイプを導入することで、ワークフローの複雑さが増します。たとえば、2、3行のコードを変更して簡単なバグを修正しようとしているときに、常に新しい機能ブランチを作成するように強制するのは間違っているかもしれません。

バグの解決は多かれ少なかれ複雑であることは誰もが知っています。そのため、些細なバグが発見された場合は、複雑さと管理を削減して余分なオーバーヘッドを取り除き、人々に直接コミットさせることをお勧めします。マスターまたは開発ブランチ。しかし、修正の性質がより複雑になるにつれて、修正のために新しいブランチを作成するための余分なオーバーヘッドの価値があります。特に、そのサイズと長さがわからない場合、または自分と他の開発者とのコラボレーションを改善したい場合。

より良いアプローチがある場合、それについて共有したり、それに関する記事やディスカッションへのリンクを提供したりしませんか?

これは間違いなく良いアプローチであり、ほとんどの場合似たような開発プロセスを持っているため、ほとんどの場合に当てはまるかもしれませんが、すべての人に適しているとは限りません。今すぐコードをどのように処理するかを検討し、既存のモデルに適合する分岐モデルを作成することを強くお勧めします。

最も重要な点はgitを使い始めることであり、残りは自然に続くでしょう。シンプルに始めて、徐々に改善していきますクリエイティブに!

乾杯

1
Magnus Skog