マスターから作業ブランチに変更をプルしますか?


16

私たち2人が何かに取り組んでいます。このブランチ構造を使用しています

  • 主人
  • dev-A
  • dev-B

私たちは両方とも別々のブランチ(dev-A、B)で作業し、作業が完了するたびに、変更をマスターにプロモートします。

しかし、これの欠点は、他の開発者が行った変更を取得できないことです。すべてがマスターツリーに存在しますが、他の開発者が行った最新の更新を取得することはできません。

これを解決する方法はありますか、ブランチ構造を変更する必要がありますか(機能ごとに)?

回答:


16

私は、2つの主なシナリオで使用される開発者ブランチを見てきました。

  1. これらのブランチは実際にはリポジトリフォークであるため、プロジェクトメンテナはマスターリポジトリへのアクセスをロックダウンでき、プルリクエストによる統合が必要になります。これにより、貢献者の生活はより困難になりますが、メンテナーの方がはるかに楽になります。もちろんこれはまさにポイントであり、GitHubで非常に成功したモデルです。

  2. 継続的な統合および展開の不安定性、さらに悪いことにビルドの不安定性の実績がないチームおよび組織。これらのチームは一般に、メインラインの安定性を保護する方法として開発者ブランチを使用しようとします。結果は、通常、リリース前の長くて非常に痛みのあるマージ期間に続き、さらに長くて痛みのある安定期間が続きます。リリースまで発生しません。

これがCIを必要とする理由について暴言になりたくはありませんが、変更から十分な頻度で統合していないことがわかっていることはあなたの質問から明らかです。したがって、IMOは問題を回避する意味がありません。

外部の開発者からの変更を「ゲート」する必要がある地理的に分散したチームで実際に作業している場合を除き、開発者ごとのブランチモデルはあまり意味がありません。すべての開発者はすでに技術的に独自のリポジトリを持っているため、特にgitでは意味がありません。ほとんどの組織は、1日に数回、非常に頻繁に統合する必要があります。

私は現在、4つの別々のチームに分かれた約35人の貢献者のグループの一員です。ほとんどの人は1日に少なくとも2〜3回、一部の人は10〜15回チェックインします。ビルドが壊れているのは珍しく、数分以上壊れたままになることは非常にまれです。Gitはマージを非常に簡単に処理するため、ほとんどの場合、リモート開発者ブランチは不要なオーバーヘッドです。プッシュする前に、プルし、ローカルでマージし、コミットテストを実行するだけで、簡単です。

マスターブランチの安定性を保護するために絶対に統合を延期する必要がある場合、実証済みの典型的なモデルは、Git分岐モデルの成功で説明されているように、開発ブランチとも呼ばれる不安定なブランチを使用することです。開発者が少なくとも1日に1回、このブランチ(正常に実行せずにビルドするだけでよい)に正常にマージできない場合、リビジョン管理の問題ではなく、品質/規律の問題があります。統合されていない開発者ブランチを使用してそれをカバーすると、問題が延期されるだけであり、そうすることで、最終的なマージが実際に必要以上に苦痛で不安定になります。

機能ブランチは最悪ではありませんが、IMOが実際にそれらを保証するのに十分なほど大きいプロジェクトはほとんどありません。プロジェクトが非常に大きい場合(つまり、多数の機能が同時に処理される場合)、ソース管理の問題を紙に書き出すよりも、プロジェクトを個別の自律コンポーネントに分割した方が良い結果が得られます。

必要に応じてこのアドバイスを無視できますが、多くのチームがそうしますが、上記の分岐モデルが非常に人気があり成功している理由の1つは、それに対してではなく継続的な統合で動作するように設計されていることです。


継続的な統合の重要性は、すべてを1つのブランチに統合するという意味でも、毎日/時間ごとにビルドするという意味でも(Jenkinsなどを使用して)十分に強調することはできないと思います。
sleske 14

15

作業ブランチでは、次のようにします。

git commit -am "Committing changes before merge"
git merge master

他の開発者ブランチからマージすることもできます

git checkout dev-A
git merge dev-B

それは、masterの変更を開発ブランチにマージすることです。


はい-それは一つの方法です。gitがこのためのエレガントなワークフローを持つことを望んでいました。
ウトカルシュシンハ

2
よくgitは通常、各開発者が独自のローカル作業リポジトリと、開発者がプッシュおよびプルする共有中央リポジトリを持っている場合に最適に機能します。こうすることで、それぞれが同じブランチで作業し、中央リポジトリにプッシュして変更を取得および更新して更新を取得できます。それはおそらくあなたが探している優雅さです。gitは、競合がない限り、自動的にマージを処理します。 git flowは、ワークフローの優れた追加機能です。
-scaryrawr

パーフェクト。この正確な質問に対するいくつかの非常に長い回答がいくつかの場所git merge masterにありますが、チェックアウトされた機能ブランチでは私が探していたものです。おかげで
Drenai

3

dev-Aとdev-Bが異なるプロジェクトの異なるブランチである場合、@ scaryrawrが答えたものが最適です。

しかし、dev-Aとdev-Bが実際にまったく同じコード(同じプロジェクト)である場合、代替案は両方がブランチの1つで機能することです。たとえば、「devWork」という名前のマスターオフブランチを作成します。devWorkをチェックアウトし、作業を行い、変更をコミットしてプッシュします。プッシュされた変更はマスターではなくdevWorkにあり、ブランチの他のユーザーはローカルでPULLを実行するだけでプッシュされた変更を取得できます。

その後、標準的な方法に従って、devWorkの作業をマスターなどに戻すことができます。

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