複数の並列リリースブランチを備えたGitフローとマスター


87

私たちは、git-flowによって実装された成功したGit分岐モデルを採用しようとしています。現在、少なくとも2つのリリースブランチに取り組んでいます。1つは最新の安定版リリース用で、もう1つは次の(「プレビュー」)リリース用です。私が理解していないのは、すべてのリリースがマスターに対して「線形化」され、そこでタグ付けされているように見える理由です。リリースブランチでリリースにタグを付けてみませんか?なぜマスターなのか?またはなぜ開発するのブランチを、マスターを使用しないのですか?

回答:


77

git-flowモデルでは、「最新リリース」バージョンは実際にはにマップされmasterますが、「プレビューリリース」はgit-flowreleaseブランチにマップされます。実際のリリースが行わdevelopれるmasterときにフォークされ、最終的にマージされます。その後、これが「最新リリース」になり、通常、git-flowhotfixブランチを使用して、そのリリースのバグのみを修正します。このように、はmaster常に最新リリースバージョンの最も安定した状態を表します。

古いリリースのバグを修正したり、そこで他の開発を行ったりする場合はsupport、適切なコミットからブランチをフォークしmasterます(すべてのバージョンがそこで作成されます)。supportブランチはまだ実験的であり(ドキュメントによると)、十分に文書化されていません。しかし、コマンドラインヘルプからわかるように:

usage: git flow support [list] [-v]
       git flow support start [-F] <version> <base>

これらのブランチは開始されたばかりであり、masterまたはにマージされることを意図していませんdevelop。「古代」のリリースまたは「古代」のリリースで実装するように顧客から要求された機能に対する修正は、に戻れないか、戻らないため、これは通常は問題ありませんmaster。それでも思うなら、あなたがポートに(で表さあなたのメインの開発ラインに修正したいmasterとしdevelop)、ちょうど開始しhotfix、変更内容をチェリーピックと仕上げhotfix


17
これは、テストからQA、本番への遅いパイプラインには対応していません。2つ(またはそれ以上ですが、今のところ2つとしましょう)のリリースブランチが開いている可能性があります。それぞれがパイプラインの異なるステージにあり、テストで見つかったバグの修正を許可する必要があります。その場合、開発ブランチは、ブランチがまだ作成されていないリリースの機能が蓄積されていた場所になります。このような状況では、リリースn-2の修正は最終的にマージされて開発されますが、少なくとも標準のgitフローに従って、リリースn-1をスキップします。これにより、n-1でリグレッションが発生し、最終的にリリースnで修正されます
Brendan

リリースブランチが保持されないのはなぜですか。新しいリリースブランチが作成されると、古いブランチは「サポート」ブランチに進化します。
lkanab 2017年

1
リリースブランチが開発から「分岐」するだけでなく、開発から「分岐」するのはなぜですか?
サンドラ

gitflow-avhは、元のgitflowの維持された(つまり、死んでいない)フォークのように見えます。git flow support実験的とはマークされていません。
Timo Verhoeven 2018

9

枝に少し重点を置きすぎたメンタルモデルのように見えます。同意します。コミットをマスターにマージする代わりに、リリースしたコミットにタグを付けることができます。

でも、絵はきれいです。すべてをマスターにマージすると、バージョンタグがグラフ全体に散らばる代わりに、リリースが時間順に明確に示されます。

ただし、このモデルは古いリリースのバグ修正には機能しないと思います。それはきちんとした順序を台無しにします。

  1. バージョン1.0.1以降の機能を追加し、1.1.0をリリースしたとします。
  2. 1.0.1でバグを発見し、両方のバージョンで修正したいと考えています
  3. マスターの1.1.0の後に1.0.2を追加してから、1.1.1も直接(またはその前に)推論する必要があります。

あなたの質問に答えるために:これは、場合によっては単純なメンタルモデルを作る一連のルールだと思います。すべてのルールが純粋に技術的な観点から意味があるわけではありませんが、それが悪いことにはなりません。メンタルモデルは人間にとって良いものです。


1
supportブランチは古いリリースのバグ修正用に設計されていますが、「実験的」とラベル付けされています。
mstrap 2013年

2

個人的には、前述のgit-flowは複雑すぎると思います。

GitHubを使用している場合は、 GitHub flow(Scott Chaconの説明に従って)。

これは、複数の機能でのコラボレーション、コードレビューに特に役立ち、次を使用して継続的インテグレーションソリューションと組み合わせることができます。 Commit Status API

更新TheGitHubFlow™の新しい公式ウェブサイトがあります

更新2:GitHubFlow™用の新しい公式(および簡略化された)GitHubガイドがありますhttps//guides.github.com/introduction/flow/


10
GitHubフローは、リリース中心ではないコンテキストにのみ適しています。git-flowプロセスは、主に「リリース」を中心に設計されています。毎日、多くの場合1日に数回本番環境にデプロイするため、実際には「リリース」はありません。
レミMélisson

10
また、私は本当に素晴らしい機能しないことにgit-フローを追加するにはメンテナンスリリースを持ってリリース中心のコンテキスト。たとえば、1.3.0リリースの後に1.2.1リリースが発生するとどうなりますか?おそらくmaster、作品の年表の異常にマージすることはできません。
ケンウィリアムズ

mstrapの回答で説明されている@KenWilliams、これがsupportブランチの目的です。しかし、その通りです。そのようなリリースがにマージされないのは確かに異常です。これはmaster、私の理解では、すべての製品リリースを保持する必要があります。
beatngu 1320

2

私の場合、基本は同じですが、各バージョンにはいくつかの異なる機能がある同じソフトウェアの2つのバージョンがあります。

つまりworktree、2つ作成します。つまり、マスターの横に2つの関連する長期実行ブランチを作成します。

$git worktree add -b version-silver ..\version-silver master
$git worktree add -b version-gold ..\version-gold master

で、〜がある:

$git branch
master  # base stuff here
version-silver # some normal features
version-gold # some better features

リポジトリは1つですが、上記のブランチごとに3つの別々のフォルダが並んでいます。そして、マスターで一般的な変更を加えます。次に、それを他の両方のバージョンとマージします。

cd master
vim basic.cpp
git add .
git commit -m "my common edit on basic.cpp"
cd ..\version-silver
vim silver.cpp
git add .
git commit -m "my specific edit on silver.cpp"
git merge master # here i get the basic.cpp latest changes for silver project
cd ..\version-gold
git merge master # here i get the basic.cpp latest changes for gold project

各バージョンの特定の変更も対応するフォルダーに保存され、各プロジェクトの作業は分離され、IDEが混乱することはありません。

お役に立てば幸いです。


2

@Motに完全に同意します。

同じ質問を聞くのはいいことです。

私たちのチームはまた、Successfulよりも多くのユニバーサルブランチモデルを探していました。つまり、前述の@Motのように、主なアイデアは、リリースをサポートするための追加のリポジトリを導入しないようにすることです。たとえば、安定したリリースのためにkernel.orgによって行われるため、個別の* .gitリポジトリにブランチがあります。しかし、kernel.orgは、ダウンロードされたサイズを最小限に抑えるためにそれを行っています。

私にとっては、開発のメインラインとしてマスターを使用する方がクリーンなようです。

また、リリースにはいくつかの競合があります- *モデルマスターにマージし、後でアイデアをタグ付けします

マスターでコミットが行われるたびに、Gitフックスクリプトを使用して、ソフトウェアを自動的にビルドし、本番サーバーにロールアウトします

原因の終了(マージとタグ付け)はアトミックトランザクションではありません:

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2

gitフックが自動バージョン管理サポートを使用してビルドを開始する場合:

$git describe --tags --long >.ver

その場合、誤ったバージョンが次の目的で作成される可能性があります。

$ git merge --no-ff release-1.2

Successl oneでのバージョン管理では、バンプバージョン処理 が導入されることは知っていますが、自動ではありません。

つまり、-リリースのブランチモデルに導入する主な違い-*マージとタグ付けは次のとおりです。-ブランチの作成時にリリースにタグを付ける-リリースのブランチを保持して、将来のメンテナンスを可能にする


-2

マスターブランチは常に本番コードベースを表す必要があるため、本番リリースの直後に常にコードをマスターにマージして戻します。

タグ付けは、製品リリースに組み込まれた正確なコードを「記憶」するために使用されるため、後で戻って、問題が発生した場合にコードを分析できます。

これにより、理論的には、マスターにマージして戻した後、リリースブランチとマスターブランチのどちらでコードにタグを付けるかは重要ではありません。私は個人的にリリースブランチのコードにタグを付けることを好みます。これはまさにビルド/リリースに入ったコードだからです(マージで何かがうまくいかない可能性があると仮定して)。

開発ブランチの概念の問題は、シングルスレッドであるということです。このスレッドのBrendanは、開発ブランチの概念を含む使用可能な戦略について言及しました。


4
複数のリリース(v1.0、v1.1、v1.5など)を並行して維持する場合、「本番コードベース」とは何ですか?
トーマスS.

プロダクションコードベースは、現在プロダクションにあるものです(例:v1.0)。ブランチには、将来本番環境にデプロイされるリリース(V1.0.1、v1.1、v2.0など)の変更が含まれています。「将来の」リリースが本番環境にデプロイされると、マスターにマージされて、マスターが本番環境にあるものを反映するようになります。また、前方にマージされるため(v1.0.1から1.1およびv2.0など)、v1.1が本番環境にリリースされたときにv1.0.1の変更が失われることはありません。
バーニーレンツ2017年

4
私は、将来のバージョンではなく、複数のリリースされたバージョンを維持することについて話している。
トーマスS.

4
あなたは私を理解していないようです。一部の企業では、複数のリリースバージョンが維持されていると想像できませんか?たとえば、MicrosoftはWindows 7、8、8.1、および10の更新も維持しているので、他の会社はどうでしょうか。
トーマスS.

1
それは正しいトーマスです。このモデルは、Webサイトなど、特定の時点で単一の製品リリースがある製品を対象としています。このモデルは、同じバージョン番号を使用してandroidまたはiPhoneビルド(または両方)を生成するようにビルドがパラメーター化されているAndroidやiPhoneなどのモバイルビルドにも使用しました。一部のコンポーネントが共有され、一部のコンポーネントが異なる可能性がある、任意の時点で複数のライブバージョンが本番環境にある製品のビルドモデルを構築する方法についてのご意見をお聞かせください。...私たちに知らせてください
バーニー・レンツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.