「開発」ブランチの廃止傾向


82

GitHubで人気のあるプロジェクトを最近見ていると、developブランチがないことがわかりました。実際、GitHub Flowガイドでも言及されていません。私の理解から、master常に完全に安定し、生産を反映する必要があります。開発者が機能ブランチに取り組んでいてmaster、それらが完了したらそれらをマージする場合、機能/修正がマージされmastermasterブランチが実際に本番よりも新しい期間があることを意味します。

チームが機能/修正ブランチを作成developし、そこにマージして、次のバージョンが完全にリリースの準備ができたら、developマージされmasterてタグが作成されるのはより理にかなっていますか?人々がに直接マージされmastermasterブランチのコードベースが大幅に変更されたために修正が困難になるバグが本番環境で報告されていると想像してください。その後、開発者はユーザーに次のリリースまで問題を解決するまで待つように指示するだけです。

編集:この質問は「分岐するかしないか」とは異なります。特に、developブランチの使用から遠ざかる人々と、それを取り巻く理由を扱っています。これは、長い間ベストプラクティスとして宣伝されていたためです。


11
gitが可能にする多くの可能なワークフローがあります。すべてのプロジェクトでgitflowまたはgithubフローが使用されることを期待すべきではありません。

非常に興味深い質問です。私は長年nvie.com/posts/a-successful-git-branching-modelで働いてきましたが、私はそれが好きだと言わざるを得ません。私が一番気に入っているのは、a)マスターが本番環境にあり、バージョンにも適用されること、およびb)ホットフィックスと機能に明確な違いがあることです。しかし、この議論をした後、私はそれが物事を過度に複雑にしているのではないかと疑い始めました。それについて何か意見はありますか?
アスパシア

1
マスターは生産中のものの記録であるという概念が嫌いです。本番の内容を知る必要がある場合は、本番を照会するだけで、本番の内容を正確に反映するマスターに依存する必要はありません。
ジムV

回答:


52

これは、1日に数回統合が行われるCIの考え方に基づいています。

両方の長所と短所があります。

私たちのチームでは、追加のメリットは提供せず、いくつかの欠点があると考えたため、developブランチも放棄しました。欠点を補うためにCIソフトウェア(Teamcity)を構成しました。

  1. 特定のコミットの展開を有効にします。つまり、ブランチを展開しません。コミットをデプロイします。
  2. ホットフィックス/プレフィックスで始まるマスターまたはブランチをデプロイできます。

これが機能する理由は、すべてのプル要求に潜在的に解放可能なコードが含まれているためですが、これはすべてのコミットをマスターにデプロイすることを意味しません。

開発ブランチを放棄した主な理由は、実際に含まれているものを見るには大きすぎて時間がかかる傾向があるためです。少し早めに何かを展開した場合は、修正プログラムのブランチから分岐して直接展開します。


10
アーメン、その事を放棄:ちょうどそれがすべての今してマスターにマージ持って、私は言うことができ、1年か2年のために枝を開発して働いた]
stijn

面白い。たとえば、バージョン1.3をリリースするときに、特定のコミットにタグを付けると仮定しますmaster。そのためmaster、流動状態にあるときに後でバグが発生した場合、1.3タグからホットフィックスを簡単に分岐できますか?
ffxsam

5
「開発」のメリットは、作成しているソフトウェアの種類、展開方法、複数のライブバージョンをサポートする必要があるかどうかに大きく依存していると思います。
-axl

1
@ffxsamでは、現在デプロイされているgit idを追跡しているため、タグ付けする必要さえありません。これは、TeamCityの両方に記録され、展開されたdllとazure管理ポータルに分岐します。そのため、TeamCityによって行われる自動タグ付けを除き、さらにタグ付けする必要性は感じていません。タグ付けが適切であると感じた場合、作業の流れが良くなり、うまく解決できます。しかし、はい、原則として、現在展開されている変更から直接分岐して、修正プログラムの分岐を作成します。
エスベンスコフペダーセン

25

リリースするプロセスが複雑で、深刻なリリース候補が必要な場合、開発ブランチがより重要になります。

たとえば、あなたが車のファームウェアであるソフトウェアを書いていると想像してください。これは...修正するのは容易ではなく、どのリリースでも、実際のハードウェアで実行される包括的な非CI /統合テストのセットが含まれる可能性が高いです。

その場合、マスター以外のブランチ(「開発」など)で「リリース候補」を分離する方が理にかなっている場合があります。これにより、これらのテストを実行しているチームは、機能をマージするブランチを持つことができます。

Webアプリやその他の簡単に更新できるソフトウェアには、この制約はありません。

ただし、次のことに注意してください。

  • githubの多くの(ほとんどの?)プロジェクトには、このような制約はありません
  • メインの「マスター」は同じ目的を果たします
  • 「PRをマスターにする」というワークフローは、「このレポですぐには分からないブランチに対してPRを行う」よりもはるかに普遍的です。

18

私がプロジェクトで見た2つの哲学があります、そして、私は選択がただ好みの問題であると思います:

  1. 「マスター」を製品リリースとして指定し、「開発」ブランチで開発します。

  2. 「マスター」で開発し、安定した製品リリース用に別の名前のブランチを用意します。プロジェクトに一度に複数のリリースブランチがある場合、これはさらに理にかなっています(たとえば、現在の推奨ブランチはRelease-1.8ですが、Release-1.7も維持しています)。

どちらも一般的なアプローチであり、長所と短所があります。


仰るとおりです。リリースブランチを用意し、次の本番リリースまでそれらを維持することを好みます。ホットフィックスを作成する必要がある場合は、最後のリリースブランチをチェックアウトして作業し、それらのホットフィックスをマスター/開発ブランチにマージします
ジョニー

まさに。「マスター」がすべきことは、ほとんどセマンティクスです。正しく行うための基本的なことは、本当に正当な理由がない限り、永遠に生きる複数のブランチを双方向に同期させる必要を回避することです。Git Flowの「マスター」ブランチは「開発」の時間差レプリカにすぎないため、実際にはカウントされません。アンチパターンは、メインの開発ブランチがリリースに至らない変更を保持することを可能にします。これは私が見た衝撃的な一般的な慣行です。上記の両方のモデルはこれを防ぎます、それが彼らが働く理由です。
ジョンミケロー

7

本番環境へのリリースにはタグを付けることができるため、リリースされた状況は、この目的のためにブランチ全体をささげることなく常に再現できます。

マスターがリリースできない瞬間に重大なバグが本番環境で見つかった場合、タグをチェックアウトし、そこから新しい「hotfixes-for-release-1.2.0」ブランチを開始するのは簡単です。しかし、それはかなりまれです。

ほとんどの場合、Webアプリケーションでは、マスターは前回のリリースから変更されていますが、それほど重要ではありません。そのため、修正されたマスターから新しいリリースを実行するだけです。とにかく非常に頻繁なリリースを行うのに役立ちます。


5

開発者が機能ブランチに取り組んでいて、それらが完了したときにそれらをマスターにマージする場合、機能/修正がマージされmastermasterブランチが実際に本番よりも新しい期間があることを意味します。

...

人々がまっすぐにマスターにマージされ、マスターブランチのコードベースが大幅に変更されたために修正が困難になるバグが本番環境で報告されていると想像してください。

それはGithub Flowではありません。

リンクによると、これはGithub Flowのデプロイ/マージプロセスです。

展開する

プルリクエストがレビューされ、ブランチがテストに合格したら、変更をデプロイして本番環境で検証できます。ブランチで問題が発生した場合、既存のマスターを運用環境にデプロイすることでブランチをロールバックできます。

マージ

本番環境で変更が検証されたので、コードをmasterブランチにマージします。

(エンファシス鉱山)

言い換えれば、master生産の先を行くことはありません。同様に、masterすべてがレビューされ、テストされ、にマージされるに実稼働ロールアウトされるため、常に(未発見のバグを除いて)安定したリリース可能な状態になりmasterます。


いいね!これは非常に直感的です- master運用環境にプッシュする機能ブランチが失敗した場合、常にロールバック位置になります。そうでない場合は、マージされmasterて新しいフォールバックになります。私はそれが好きです。
ビル・ホーバス

1

私が見る問題は、Git / Hubフローのデプロイ/マージでは、一度に1つの機能が開発/テスト/マージ/デプロイされることを前提としていることです。私の経験では、そうではないことがよくあります。一度に機能をマージすると、リグレッションの問題が発生する可能性が高くなります。機能がマスターに、場合によっては実稼働環境にマージされた後にのみ発見されます。

複数の機能をテストし、複数の機能をマージして同じものを展開する方法が必要です。qa / uatにデプロイされる「バンドルブランチ」(テスト準備機能のブランチがマージされたマスターから作成されたブランチ)を使用しています。uat中の修正は機能ブランチでのみ発生し、それらはバンドルブランチに再マージされます。バンドルブランチのサブセクションが承認された後、バンドル内の承認された機能のみがマスターにプルリクエストされ、サイクルが継続されます。

これをGitflowで使用しますが、GitHubフローに使用することを考えています。QA / UATの多くの機能を一度に発行することは重要なようです。GitHubフローの別の問題は、すべてのsr開発者を想定していることであり、常にそうであるとは限りません。

単純化されているため、GitHubフローを使用します。バンドルのような機能があれば、もっと準備ができていると思います。バンドルはリリースに似ている可能性があります。しかし、私はまだこれについても熟考しています。

もう1つの問題は、プル要求プロセスがマスターにマージする前に最後に発生することです。ただし、ビジネス品質テストの前にレビューをコーディングしたい場合があります。そのため、マージのかなり前です。

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