各スプリントの複数のブランチ/開発者からのコードの統合をどのように処理しますか?


42

開発者は、各スプリントのマスターブランチへのストーリーの統合について懸念を表明するレトロコールを終了しました。開発者はすべて自分のブランチ内のコードを作成し、スプリントの終わりに向かってすべて1つのマスターブランチにマージします。

次に、ある開発者(通常は同じ開発者)に、すべてが他の開発者のコ​​ードとうまく統合されていることを確認するタスクを残します(ほとんどの変更は同じページにあります。たとえば、データ表示ストーリー、データフィルターストーリー、 SLAインジケータ)。

この負担を軽減し、コードをより簡単にマージするにはどうすればよいですか?私の観点からすると、POまたはSMがストーリーをより効率的な方法で優先順位付けすることで、同じスプリントでこれらの種類の依存関係がなくなるため、いくつかの問題が解決する可能性があります。他のみんなはどのようにこれに取り組んでいますか?または、これはプロセスの一部ですか?


18
継続的な統合が行われる開発ブランチはありませんか?
カヤマン

13
私はここでカヤマンと一緒にいます、これのベストプラクティスは継続的な統合を実装することです。
RandomUs1r

27
ハッピーマージデイ!あなたの問題がThe Daily WTFの何かにあまりにも似ているときはいつでも、あなたはあなたが困っているのを知っています。
user3067860

早期にマージし、頻繁にマージします。{失敗する最小のテストコードを書く(赤)、合格する最小のプロダクションコードを書く(緑)、リファクタリング、再テスト、マージ}終了しません。
ctrl-alt-delor

1
最初のチェックインが勝つ!最後になることはありません!:-)
ChuckCottrill

回答:


88

Gitを使用している場合、各開発者はdevelopブランチから独自の機能ブランチにプルして、現在のベースラインからあまり遠くに行かないようにします。彼らは毎日それを行うことができるので、数日以上かかるタスクは同期されたままで、マージの問題はまだ小さいうちに解決されます。

開発者が作業を完了すると、プルリクエストを作成します。承認されると、developブランチにマージされます。

developブランチは、常にコードを働いていて、いつでもリリースの準備ができているはずです。実際にリリースするときは、マージdevelopmasterてタグを付けます。

適切な継続的インテグレーションサーバーがある場合、特にプルリクエストの場合、変更がチェックインされると各ブランチが構築されます。一部のビルドサーバーはGitサーバーと統合して、ビルドが失敗した場合や自動化されたテストが失敗した場合に、プルリクエストを自動承認または不承認にします。これは、潜在的な統合バグを見つける別の方法です。


73
重要な部分(回答でのみ暗示されています)は、スプリントの終わりだけでなく、通常1〜5回のコミットで、準備ができたらすぐにブランチをマージすることです。開発者ごとに1つのブランチではなく、機能/ストーリーごとに1つのブランチ。そのためには、ストーリーが非常に小さい、つまり最大で2日間かかることが必要です。
アモン

@amon、同意しました。「機能ブランチ」という言葉を追加しましたが、この答えをかなり小さく保つようにしています。このプロセスをさらに深く掘り下げる良い記事がたくさんあります。
ベリンロリチュ

5
自分のブランチで孤立したままにしないでください。それがマージ地獄の始まりです。メインライン開発を使用し、機能の切り替えやその他の実行時構成の背後で進行中の作業を分離します。
ロブクロフォード

3
@Zibbobz私のチームは、明示的に「機能ブランチ」を使用します。これらは基本的に開発ブランチと同様に扱われますが、その変更に関連するプルリクエストとコミットのみに使用されます。一般的に、それがどれだけ長く離れていなければならないかに応じて、数日ごとに誰かが開発からの変更を機能にマージし、問題を解決します。こうすることで、ブランチはマージするときにできるだけ似たものになります。注意点としては、これが唯一の本当に大きな破壊の変化のためである
reffu

9
「機能の切り替えやその他の実行時構成の背後で進行中の作業を分離する」代わりにconfig hellを実行することで、マージhellを回避しました。「地獄の統合」は一度に1人の開発者にとっての問題であり、定期的に同期するだけで簡単に回避できます。
キュービック

23

私は同じ問題に苦労したチームで働いていました。統合するまでの時間が短ければ短いほど、難しくはならないことがわかりました。継続的インテグレーションを教えるほとんどの人が、数分ごとにコミットすることについて話していることを知っています-私たちはおそらく実際に1時間ごとにコミットしました。

また、建物だけでは不十分であることがわかりました。誤って互いのコードを壊さないようにするために、適切なテストカバレッジレベルが必要でした。


2
これも私の経験です。コミットの頻度は重要ではありませんが、一度コミットするとすぐに統合/コミットをマージすることで、後の労力を大幅に節約できます。私はかつて、それぞれが数か月分の作業を行う3つの分岐する開発ブランチを持つプロジェクトに参加しました。それらをマージするのは楽ではありませんでした。私はその間違いから多くを学びました:)
アモン

4
はい-これが「継続的統合」の意味です!変更を他の開発者の変更と継続的に統合しています!
ロブクロフォード

@Rob、同意した。私の声明は、継続的統合が継続的でないことを示唆することを意図したものではありませんでした。理想を十分に達成できなかったにもかかわらず、それに近づくことには多くの利点がありました。
ダニエル

12
  • ブランチを短命にしてください(すでにこれを行っているようです)。
  • テスト結果がわかるようにします。
  • スプリントの終了を待たないでください。

このためにTDDをサブスクライブする必要さえありません。必要なのは、開発者の機能が正しく機能していることを証明するテストだけです。これらには、単体テストと統合テストが含まれる可能性がありますが、理想的には重要な機能の自動化されたエンドツーエンドのテストのカップルになります。標準の回帰パックのもの。

次に、マージが完了したら、自動化テストレポートを一緒にチェックし、すべてが正常に統合されたことを確認できます。

著者は、Git PRが各開発者に自分の作業をマージさせることでこの問題を解決すると述べた他の回答の1つに同意します。

私が信じているもう1つのポイントは、最後の段落まで残すのに十分重要です。スプリントの終了まで待つのではなく、夜間のビルドで手動テストを実行することをお勧めします。開発者は、機能が完成したらすぐに統合して、できるだけ早く統合、展開、およびテストできるようにする必要があります。


6

しないでください

言語と編集しているファイルによっては、各開発者が自分のブランチで編集することは意味をなさない場合があります。たとえば、C#では、一度に1人のUIデザイナーファイルのみを編集するのが最適であることがわかりました。これらは自動生成されたファイルであるため、明確な理由なしにコードが移動される場合があります。これにより、ほとんどのマージツールが大混乱に陥ります。

これは、UIの作業が完了するまで、一部のストーリーが他のストーリーをブロックする可能性があることを意味します。および/または、UIをレイアウトするだけの新しいストーリーが作成され、他のストーリーが機能を実装します。または、1人の開発者がすべてのUIの作業を行い、他の開発者がそのUIの機能を実装する場合があります。

関連する注意事項として、複数のストーリーがすべて同じファイルに触れていることがわかっている場合は、それらのストーリーをすべて同時に処理しないようにすることができます。すべてを同じスプリントに引っ張ったり、1つ以上の作業が完了するまで作業を開始したりしないでください。


正直なところ、使用中のバージョン管理ツールは、分岐とマージを成功させるためにより重要です。C#コードとおそらくWinFormsまたはWebFormsのコードを使用していても、通常はそれほど変更しないでください。もしそうなら、おそらくコードで遊ぶ前にいくつかのモックアップを行う必要があります。XAMLベースのUIは、通常のコードと中間コードとして安定したがチェックインされていないのと同様です。
Berin Loritsch

2
@BerinLoritsch WinFormsデザイナーコードは、視覚的なわずかな変更でも、実際に大幅に変更される可能性があります。コードの行自体は同じであることがわかりましたが、特に複数の開発者が同時に編集を行う場合は、順序が大きく異なります。VCSツールの問題かもしれませんが(いくつか使用しているので、間違ったものを使用しているのかもしれません)、プロセスを少し変更する方がはるかに簡単です。
mmathis

2
@BerinLoritsch少なくとも勝ちフォーム(ここではWebフォームを使用したことはありません)については、ここで2番目にmmathisを実行する必要があります。winforms UIデザイナーは、フォーム上のどこかの些細な変更に応じて、デザイナーファイル内のすべてのコードをランダムに並べ替えることを好みます。各コミット(複雑なフォームで簡単に10分または15分になることがあるもの)の前に並べ替えを手動で取り消さない限り、デザイナーファイルの履歴はまったく役に立ちません。地獄からのマージ競合。ロックは一般にひどいオプションですが、winformsを使用することは実際に最も悪いことです。
ダン・ニーリー

@DanNeely、それが私たちのチームがWinFormsコードから移行した理由の1つにすぎません。もう1つの理由は、デザイナーが非常に壊れやすく、複雑なフォームの一部を視覚的に編集できないことです。最終的にはコードビハインドに直接変更を加える必要がありました。おそらく、ここで大混乱を覚えていないのでしょう。それと、高密度ディスプレイで作業しているユーザーは、本当にWPFに追い込まれました。高度な学習曲線を伴う痛みを伴うプロセスですが、最後には素晴らしい報酬があります。とにかく、バックログのほとんどの記事はアプリのさまざまな部分に関するものでした。
ベリンロリチュ

@BerinLoritsch同じです。勝利フォームは、私の前の仕事で10年のほとんどの間、私の法案の大部分を支払いましたが、今後再び二度と触れないことは非常に幸せです。
ダン・ニーリー

2

遅延および大規模なマージを回避するための別の可能なアプローチは機能フラグです。変更を意図した前にアクティブにならないようにする(理想的には動的に)設定可能なフラグで変更を保護します。

これにより、master何も壊すことなく、変更を早期に、または共同開発ブランチにマージできます。他の開発者は、これらの変更を機能ブランチにマージして戻す(またはそれに応じてブランチをリベースする)ことができます。

他の答えがすでに指摘しているように、これは継続的な統合ソリューションと組み合わせる必要があります。

機能フラグには追加の利点があります(たとえば、A / Bテストが簡単になります)。詳細については、Martin Fowlerによるこの記事を参照してください。


0

機能ごとに個別の開発ブランチのアプローチを採用しており、統合テスト環境でテストするためにブランチをQAブランチにマージしています。

回帰テストと統合テストが完了すると、すぐに使用できる機能をリリースブランチに簡単に移行できます。

すべてがうまくいけば、リリースブランチをマスターブランチにマージします。


0

簡単に言えば、コミットとマージはマージ競合の機会を減らすことが多く、競合を大幅に減らします。他の部分は、実際にリードが計画を立てているため、作業がスムーズに流れるようになります。

他の回答は、コミットのベストプラクティスに関する優れた洞察を提供し、単純にそれらに従うことで、おそらくマージの問題の大部分を減らすことができます。マージを増やすことはほぼ確実に必要ですが、小規模なチームの場合、1人あたりのブランチアプローチはおそらく十分に機能します。もちろん、より拡張性の高いプラクティスを開始しても、それほど痛いことはありません!

ただし、最も重要な質問の1つ、つまりコードの同じ領域に全員が触れている場合の対処方法について、誰も対処していないようです。これは、コードベースに精通しており、さまざまなタスクの依存関係を認識できるリードがいると便利です。作業とコミットのタイミングを調整しないと、マージの競合と行ごとの解決に終わる可能性があります。大規模なチームではタスク\タイミングを整理することははるかに困難ですが、小規模なチームではこれらの競合するタスクを特定することが可能です。リードは、競合を完全に回避するために、関連するすべてのタスクを同じエンジニアにシフトすることさえできます。

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