新しいプロジェクトのマスターへのコミットをいつ停止する必要がありますか?


26

新しいプロジェクトを開始するときはいつでも、「安定した」何かを得るまでマスターに直接コミットすることから始めて、ブランチで作業を開始するのが通常理にかなっています。

少なくとも、これは私が通常行う方法です。2番目のコミットからすぐにブランチを開始する方法はありますか?このようにするのは理にかなっていますか?明らかに、「初期コミット」は常にマスターになりますが、その後、いつ新しい機能のブランチを作成するのが適切なタイミングであるかがわかりますか?

回答:


23

すぐに。

キーは、マスターのポリシーが何であるかという問題です。gitでは、通常、Masterのブランチポリシーはビルド可能な安定版リリースです。マスターは、ブランチが作成され、リリースブランチにマージされる前にマージされる「メインライン」である場合があります。これらは2つの異なるロール/ポリシーアプローチです。

多くの場合、プロジェクトの途中でブランチの役割またはポリシーを変更することは、人々のエラーの原因になります。ソロ開発者はこれらの変更を寄稿者に伝えるのが簡単ですが、多数のプログラマーに「マスターは1.0になりました。全員にプッシュするのではなく、機能を分岐してください」と認識させようとしています。

上記の政策アプローチについて触れました。マスターのポリシーは、ビルド可能な安定版リリースであるということです。これに小さなインクリメンタルな変更をチェックインすることは、常に安定したビルド可能なものがないことを意味します。小さな変更をチェックインしないと、最良のポリシーになる傾向がある(そして簡単な分岐によって奨励される)「多くの小さな(しかし完全な)チェックイン」に反します。

役割ベースの観点から、マスターがメインライン、リリース、メンテナンス、および開発の役割であることに始まり、その後、開発と保守の役割がブランチに移行する道を指し示します。これもまた、マスターで許可されるものの変更を意味し、物事がどこに属しているかに関して貢献者を混乱させる可能性があります。また、ブランチの履歴を(わずかに)混乱させる可能性があり、マージがより大きく、より理解しにくいことを意味する大規模なコミットを促進します。

ブランチの役割とポリシーを最初からシンプルで一貫性のあるものにします。

この「ポリシー変更の分岐」は、分岐パターンで確認できます。各ブランチに役割があるという考え方は、Advanced SCM Branching Strategiesで読むことができます。これらは両方とも非常に優れた読み取りです。


3
私はこれにほとんど同意しますが、私は単にビルド可能とは言いませんが、リリース可能(安定)と言います。マスターには、単にビルドするだけのコードを含めるべきではなく、実際に徹底的にテストしたコードを含める必要があります。重大な欠陥がないことを確信して、いつでもマスターからプルできるはずです。
アーロンノート14年

私はアーノノートに完全に同意します。なぜなら、IMHOは、1つの構築可能な状態から次の状態へのステップが常に小さな増分の変更であり、決して大きな変更ではない方法で動作することが完全に可能な(そしてベストプラクティス)からです。
ドックブラウン14年

1
@MichaelT「開発」ブランチは何度も見たことがありますが、以前に「初期のマスター」のコンテキストで説明されたことを聞いたことはありません。これを使用すると思います、ありがとう。
Droogans

13

通常、ブランチでの作業を開始したい状況は主に2つあります。

  • あなたまたはあなたのチームが次のリリース(これが初めてのリリースである可能性があります)に追加されない可能性が最も少ない新機能を開始する必要がある場合、別の機能ブランチで開発を開始します

  • 重大なバグの修正を最新リリースに提供する必要があり、それらの修正のみを含む新しいバグ修正リリースを作成したいが、新しく開発された(およびおそらく不安定な)機能は必要ない場合

この種の決定については、プログラムの最初のコンパイル可能/実行可能なバージョンがある時点から、常に「新機能」または「バグ修正」の観点から考えるのが役立つと思います。

Michael Feathersは有名な本の中で変更する4つの理由をリストしていますが、私は「リソースの最適化」を「新機能ブランチ」(非機能機能用)に、「デザインの改善」を「新機能ブランチ」の下に配置します、これは特定の機能の実装を容易にすることを目的としていない場合、IMHOは設計を改善すべきではありません。


12

あなたが続く場合はgit-流れを -率直に言って、そして、私はあなたがしている非常識だと思いますが、Gitリポジトリを使用している場合していないモデルを分岐することを使用-あなたがすべき決してにコミットしていないmasterあなたが実際に公共のリリースの準備が整うまで。

最初のコミットmasterは空のリポジトリである必要があります。次のコミットmasterは、developブランチまたは一時リリースブランチからのマージコミットであり、安定し、テストされ、展開(アプリケーションの場合)またはパブリック配布(ライブラリの場合)の準備ができている必要があります。

Gitに他にも分岐モデルがあります、そのほとんどは古い集中型SCMモデルから派生したものであり、DVCS環境で深刻な問題を引き起こす可能性があります。実際にgit-flow拡張機能を使用する必要はありません。また、必ずしもすべてのリリース/修正プログラム/機能ブランチが必要というわけではありませんが、裸の骨はdevelopand masterであり、不安定なコードが入りdevelopます。


に最初にコミットする必要さえありませんmastermastergitにとって特別なものではないことを思い出してください。そこにある必要はありません。リリースを作成するまで、開発ブランチを作成できます。
マイルルーティング14年

2
@MilesRout:それは原理的には真実ですが、ブランチが既に存在ない限りマージすることはできません。また、プロセスはマスターへのすべてのコミットは非早送りマージでなければならないことを指示します。私が何かを逃していない限り、最初の空のコミットに代わる唯一の選択肢は、任意の開発コミットまたはリリースブランチからマスターをブランチすることであり、同じコミットを共有することを意味します避けるために。
アーロンノート14年

1
ああ、それは確かに良い点です。+1して投稿およびコメントします。
マイルルーティング14年

1

ThoughtworksのNeal Fordは、「地獄の合併」の問題を回避するために、分岐を介した機能トグルの使用を提唱しています。2人のプログラマがメインブランチから毎日忠実にマージし、そのうちの1人が数週間にわたってかなりの変更を加えてからコミットする場合を考えます。他のプログラマーは非常にうまくマージ地獄に陥る可能性があります。この問題を回避するために、Fordは、ブランチを1つだけにして毎日コミットすることにより、「痛みを軽減する」こと(よく知られているアジャイル属性)を推奨しています。追加の機能は、完全にテストされるまで機能を無効にする機能トグルを介して追加されます。

この方法論は、コミットの問題が即座に検出されるため、継続的配信を実装する環境で最適に機能するようです。


1

この質問に対する最後の回答から2年が経ちましたが、今は物語が変わると思います。私にとっての答えは、「ソースコード管理を使用してバージョンを追跡するたびに」です。

詳しく述べると、最近ではソースコード管理を使用したプロジェクトバージョンの追跡が常に機能するとは限りません。(たとえば、npmを使用して依存関係を管理し、セマンティックバージョンを '^'で指定する)その場合、ビルドが発生するたびにプロジェクトのアーティファクトが変更され、ソースコードの変更に対応する必要はありません。この種の新しい課題に対処するために、一部のチームは、プロジェクトバージョンを追跡するために、アーティファクト制御システム(例:JFrog Artifactory)に保存された「アーティファクト」をすでに構築していることを選択します。

明らかに、アーティファクトのバージョン管理が既に整っている場合、GITブランチから「製品コード」をプルしてプロダクションにビルド/デプロイするのではなく、デプロイメントのために直接実行可能なバージョンのアーティファクト制御システムに相談します。そのような場合、「リリースブランチ」の概念は突然その意味を失います。また、チームがgitブランチをリリースバージョンに関連付けないことを決定するたびに、マスターに直接コミット/プッシュすることは再び適切な選択肢になります:リポジトリが複製されるたびにデフォルトのブランチとして提供されるため、広く受け入れられ、十分に伝達されたセマンティクスが自動的に与えられます変更。それでも、受け入れられた答えが示唆しているように、おそらくmasterを含むブランチにロールを割り当て、それらの特定のロールに対してのみそれらのブランチを使用する必要があります。

最後に、私はさらに一歩進んで、少数のコアコミッターのみを含むプロジェクトの開発ブランチとしてmasterを使用することを提案します。これは私のチームの場合であり、おそらくほとんどのマイクロサービスショップでも同じです。マスターでコミットすると、変更プロセスの通信が削除され、複数のスプリントにまたがる機能で作業する際の「地獄のマージ」が回避される可能性があります。さらに、masterブランチのコードは「動作」する必要さえありません。自動化されたビルド/テストプロセスが何が間違っているかを教えてくれるので、とにかくgit履歴を確認してビルド/テストを中断した作者に連絡するのは簡単です:-)


0

私は急進的な立場を取るつもりです:すべてのアイデアの分岐。最初のgitブランチは安価で、ブランチの主なコストは何のためにあるかを覚えていることです。マスターへの最初のコミットがリリース候補であることにも同意します。概念実証ブランチから始めることをお勧めします。コンセプトを証明したら、空の開発ブランチにそれをマージするか、最初の試行がどれだけ良いかに応じて書き直すことができます。この時点から、すべてのバグ、機能、抽象化などについてdevelから分岐します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.