小規模開発チームのGitブランチ戦略[終了]


186

ほぼ毎日更新およびリリースするWebアプリがあります。VCSとしてgitを使用しており、現在の分岐戦略は非常にシンプルで壊れています。マスターブランチがあり、そこに「気分が良い」変更をチェックします。これは機能しますが、重大な変更をチェックインするまでのみです。

以下の要件を満たす、小規模チーム向けのお気に入りのgitブランチ戦略がありますか?

  1. 2〜3人の開発者のチームに適しています
  2. 軽量でプロセスが多すぎない
  3. 開発者がバグ修正やより大きな機能に関する作業を簡単に分離できるようにします
  4. 安定したブランチを維持することができます(運用サーバーを機能させる必要がある「あらがた」瞬間に)

理想的には、新しいバグに取り組んでいる開発者の段階的なプロセスを確認してください

回答:


247

Scott ChaconがPro Gitで説明しているワークフローの恩恵を受けることができます。このワークフローには、常に存在する2つのブランチ、マスター開発があります。

マスターはプロジェクトの最も安定したバージョンを表し、このブランチから本番環境にのみデプロイします。

開発には進行中の変更が含まれており、必ずしも本番環境で使用できるとは限りません。

開発ブランチから、個々の機能と修正に取り組むトピックブランチを作成します。機能/修正の準備ができたら、それをdeveloperにマージします。その時点で、同僚がマージした他のトピックブランチとどのように相互作用するかをテストできます。開発が安定した状態になったら、それをmasterにマージします。masterから本番環境にデプロイしても、常に安全である必要があります。

スコットは、これらの長期実行ブランチをコードの「サイロ」と表現します。安定性の低いブランチのコードは、テストおよびチームによる一般的な承認の後、最終的にはより安定したと見なされるブランチに「卒業」します。

段階的に、このモデルでのワークフローは次のようになります。

  1. バグを修正する必要があります。
  2. 開発ブランチに基づくmyfixというブランチを作成します。
  3. 修正されるまで、このトピックブランチのバグに取り組みます。
  4. myfix開発にマージます。テストを実行します。
  5. 修正の作業中に同僚が開発にマージした別のトピックブランチhisfixと修正が競合していることを発見しました。
  6. これらの競合に対処するには、myfixブランチでさらに変更を加えます。
  7. myfixをマージして、テストを開発および再実行します。
  8. すべてが正常に動作します。マージはマスターに発展します。
  9. 安定していることがわかっているため、いつでもマスターから本番環境にデプロイできます。

このワークフローの詳細については、Pro Gitの分岐ワークフローの章をご覧ください。


7
-また、スコット・チャコンは、GitリポジトリとのGithubのワークフローがどのように機能するかの彼のサイト上での優れた記事がありscottchacon.com/2011/08/31/github-flow.html
program247365

71
これは素晴らしいと思いますが、開発ブランチからバグ修正ブランチを作成した場合は、まだリリースしていない「新しい」ものすべてをマージせずに、マスターにマージしてデプロイすることはできません。ドキュメント化/データベースの変更を必要とするブランチに何かがある場合、または何か他のことを行うのが難しい場合、本当の痛みかもしれません。緊急の「ホットフィックス」の場合は、マスターからブランチを作成する必要があります。
Richard

5
F1とF2の2つの別々の機能を開発している場合、F1は1週間でリリースされますが、F2は2週間でリリースされ、F1とF2の開発が一致すると仮定します。それについて何か提案はありますか?
Murat DeryaÖzen2013年

4
これdevelopは、gitにはない問題に対する不必要な「解決策」です。私が知る限り、成功はコメントが許可されていない誤解された記事であるかどうかがよく書かれているためです。ここではカウンターの記事だbarro.github.io/2016/02/...は
ティム・アベル

5
ステップ8で、developブランチをマスターにマージすると、開発中のコードの一部が本番環境に移行する準備ができていない可能性があるため、悪い考えのように聞こえます。機能ブランチをマスターにマージした方がいいでしょうか?
トッド

45

ソース管理を使用したことがない他の開発者に教えるための簡単な戦略を見つけようとする初心者としてやって来た後。これはhttp://nvie.com/posts/a-successful-git-branching-model/に適合するものです。manページにある標準のGITワークフローのthatsを使用してみましたが、少し混乱し、聴衆を完全に混乱させました。

過去6か月間、競合を2回修正するだけで済みました。機能の開発中に、マージ後に常にテストし、「フェッチしてマージ」または「プル-リベース」する手順を追加しました(朝と午後に1回)。また、最新のコードをプルする中心的な場所としてgithub.comを使用しました。


それは素晴らしいリンクです!このワークフローは、一度に複数のリリースバージョンで常にリモートで並行して作業する私たちの小さなチームにとって非常にうまく機能します。非常によく文書化されています。クラッチありがとう!
keithxm23 2012

ああ、これが私がそのリンクを見つけた場所です:-)私は最初のGitプロジェクトをセットアップする前にいくつかのGit戦略を調べました(私は何年にもわたってSCCSからCVSからSVNに移動しており、新しいプロジェクトでGitを試してみたかったです)そして、これは私にとって最も理にかなったものでした。あなたの投稿を認識したので、これが私が見つけた場所だと確信しています。おかげで-それは素晴らしくうまくいきます!
ボイジー

4
誰かがそのブログ投稿を拾うのを見るたびに、私は少し内で死にます。ここで反論だ:barro.github.io/2016/02/...
ティム・アベル

私はあなたと同じ気持ちを@TimAbellと共有しています。これdefault master branchが最も頻繁に使用されていない場合は、開発者であることが適切でないと強く感じますA successful Git branching model
Nam G VU

35

(私が最初に持っていたはずのように、上のコメントをそれ自体の答えにしました。)

GithubのScott Chaconから:

それでは、GitHub Flowとは何ですか?

  • マスターブランチのすべてがデプロイ可能
  • 新しい何かに取り組むには、マスターからわかりやすい名前のブランチを作成します(例:new-oauth2-scopes)
  • ローカルでそのブランチにコミットし、定期的にサーバー上の同じ名前のブランチに作業をプッシュします
  • フィードバックやヘルプが必要な場合、またはブランチをマージする準備ができていると思われる場合は、プルリクエストを開き ます
  • 他の誰かが機能をレビューしてサインオフした後、それをマスターにマージできます
  • マージされて「マスター」にプッシュされると、すぐにデプロイできます。

詳細については、記事全体を参照してください:http : //scottchacon.com/2011/08/31/github-flow.html

「プルリクエスト」はGithubの発明であり、Git自体ではなくWebサイトに組み込まれていることに注意してください。https//help.github.com/articles/using-pull-requests/


4
チームが小規模で、開発者がgitの経験が少ないため、このワークフローのシンプルさは勝っています。私たちが異なる唯一のことは、機能ブランチとマスターの間に「ステージング」ブランチがあり、非開発者が本番環境のような環境で機能を許可するためのライブQAサイトとして機能することです。
飛行隊

@Squadrons は、タコのデプロイが必要なように聞こえます。これには、さまざまな環境へのok / denyビルドへのゲートが組み込まれており、ソースコントロールをそのようなもので汚染しません。
Tim Abell

マスターから機能ブランチを作成し、それらを展開のためにマージして戻すことは、安全なロールバックポイントがあるようにタグがある限り問題ありません。展開は常に計画どおりに進むとは限りません。お金を出血させる場合、「ロールフォワードのみ」を信じるかどうかはあまり重要ではありません。
Vince Panuccio 2017年

15

masterブランチを開発ブランチとして使用し、バグ修正を実行するためのリリースブランチを作成します。

すべての新機能はmaster、開発ウィンドウ中に継続します(直接コミットされるか、プルリクエストを使用したトピックブランチとして、あなた次第です-グラフィックには表示されません)。計画されたすべての機能が実装されたら、機能フリーズを入力し、テストを実行します。満足したら、リリースにタグを付けますmasterなどv1.0

時間が経つとユーザーはバグを見つけるv1.0ようになるので、そのタグからブランチを作成し(リリース後に名前を付ける1.0など)、ブランチ内のそれらのバグを修正します。十分なバグが修正されたので、新しいリリースが必要だと思われる場合は、タグを付けてv1.0.1にマージし直しmasterます。

その間、新しい開発ウィンドウがmasterブランチで発生する可能性があり、最終的にとしてタグ付けされv1.1ます。

すすぎと繰り返し。

これは、セマンティックバージョニングの番号付けロジックに従います。

 ---------(v1.0)--------------------------------(v1.1)-----------------------------> master
             \                                     \  
              ---(v1.0.1)---(v1.0.2)---> 1.0        ---(v1.1.1)---(v1.1.2)---> 1.1

5
1.0.1変更をマージすることを忘れないでくださいmaster
kwahn

そして1.1、マージ後にマスターをリベースすることを常に心に留めてください1.0.1-これは自信を最小限に抑えるのに役立ちます。
Nam G VU

@NamGVU私はそれをお勧めしません。1.1リリースブランチであり、1つ以上のリリースの正確な状態を表すタグがあります。そのブランチをリベースすると、その表現が失われます。これを防ぐために、リリースブランチを設定して強制プッシュを拒否することを強くお勧めします。
Leif Gruenwoldt 2016年

1
いいえ。リリースブランチをマスターにマージしないでください。それはあなたが必要としないあらゆる種類の頭痛を与えることができます(リリースのみのもののマージ、新しいリリースとの競合のマージ、ビルドの破壊、非線形履歴など。信じてください、私はそれが複数回発生するのを見てきました) 。代わりに、リリースをフォークとして扱います。「bitsnbites.eu/a-stable-mainline-branching-model-for-git
m-bitsnbites

4
チェリーピックは、リリースの変更をマスターに取得するための優れたオプションです
BartoszKP 2017年

4

VCSでは、1つのブランチですべての開発作業を同時に進めることができないため、「マスター」ブランチだけを使用すると、その制限がすぐにわかります。
つまり、分岐するタイミングを知る必要があります。

ただし、DVCS(「分散型」VCSの場合と同様)では、リポジトリに対してローカルに保つブランチと、プッシュまたはプルするブランチがあるというパブリケーションの問題もあります。

このコンテキストでは、まず並行開発の取り組みを特定し、公開(プッシュ/プル)プロセスを決定します。たとえば(これが唯一の方法ではありません):

  • prodは、コードが本稼働している読み取り専用のパブリックブランチです。誰もがそれを引っ張って次のことをすることができます:
    • その上に現在の開発をリベースします(ローカルテストの場合、またはローカル開発リポジトリに統合するために、prodブランチのprodリポジトリで行われた修正プログラム)
    • 新しい機能を実行するためのブランチ(既知の安定したコードから)
    • 次のリリースブランチを開始するためのブランチ(本番になるブランチ)
      誰も直接prodにプッシュしないでください(したがって、読み取り専用です)
  • releaseは読み書き統合ブランチであり、関連するコミットが次のリリースの一部として厳選されています。
    誰もがリリースにプッシュして、次のリリースを更新できます。
    誰もが彼/彼女のローカル統合プロセスを更新するために、このリリースから引き出すことができます。
  • featureXはプライベートな読み取り/書き込みブランチであり(中央の製品リポジトリにプッシュする必要がないため)、開発リポジトリ間でプッシュ/プルできます。毎日の開発とは異なり、中長期的な取り組みを表しています
  • masterは現在の開発を表し、開発リポジトリの間でプッシュ/プルされます。

このSOの質問が証明するように、他のリリース管理プロセスが存在ます。


3

ReinHのアジャイルチーム向けGitワークフローを読む:http ://reinh.com/blog/2009/03/02/a-git-workflow-for-agile-teams.html

これは小さなチームにとって非常にうまく機能します。ここでの目標は、潜在的に不安定である可能性のあるすべてのものがある種のブランチに入るようにすることです。機能ブランチの外で作業している全員がそれを使用する準備ができたときにのみ、マスターにマージして戻します。

注:この戦略はgit固有ではありませんが、gitを使用すると、この戦略を簡単に実装できます。

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