頻繁な合併の競合は問題の兆候ですか?


35

チームでは、ソース管理としてGitを使用しています。ほとんど独立しているが重複するコード領域がいくつかあります。最近、ソース管理を使用するためのワークフローとアプローチについて議論してきました。機能ブランチワークフローの使用を促進するときに出てくる不満の1つは、人々がしばしば複雑なマージ競合に遭遇し、それが誤って解決されることです。複雑なことで、私は「解決方法については明らかではない」という意味です。これを踏まえて、「プルリベース」ベースのワークフローなど、他のワークフローがより積極的に使用されています。

機能分岐アプローチの支持者として、私は実際に苦情を受け取っていません。はい、ローカルの機能ブランチをマスターまたはどこからでも最新の状態に維持する必要がありますが、それが唯一の本当の問題です。マージが常に複雑で、二次的な影響がある場合、それはGitの問題ではなく、チームワークの問題であると考えています。

これを考えるのは正しいですか?複雑なマージの競合は、良いものか悪いものかの兆候ですか?


1
機能はどれくらい持続しますか?コードはどの程度モジュール化されていますか?(たとえば)テストコードコミットでチェリーピック(最初に行われ、実際のコードとは別に行われました)で、機能がどのように変化したかを確認できますか?

@MichaelTコードベースは、自動テストコードベース用です。私たちはプロジェクトに新しい追加の作業を開始しようとしていますが、これには少し並行開発が必要になる可能性があります。したがって、機能ブランチと他のブランチの議論。
-joshin4colours

7
人々は実際にこの種の問題に遭遇しますか、それともそれらの問題が現れるのを恐れているだけですか?
クリストファー・クロイツィヒ

2
ところであなたがリンクしている
素晴らしい

1
機能ブランチのリベースまたはトランクとのマージは、同様のマージをもたらします。リベースは実際にはより多くのマージを行うため、悪い競合を引き起こす可能性が高くなります。重要なのは、それがどれくらいの頻度で行われるかです。
ジャン・ヒューデック

回答:


23

問題があなたのコードであることは不可能ではありません。コードベースにモジュール間の多くの相互関係がある場合、すべての変更はどこにでも触発され、開発者が他の人のコードとやり取りすることは悪夢になります。

最初に他の方法でこれに気付くと思う傾向がありますが、あなたはそれをもう見ることができないほど慣れている可能性があります。


9
これは私の最初の考えでした。同じコードに複数の変更が加えられると、複雑なマージの競合が発生します。あなたがかなり若いプロジェクトを持っている場合、これは一般的ですが、適切なサイズのコードベースを持っている場合、これは「ゴッドオブジェクト」の兆候であるか、いくつかのモジュール/クラスが多すぎてリファクタリングする必要がある可能性があります。また、熱心なコミッターが何十もの小さな変更をコミットすることから生じることもありますが、それはあまり一般的ではありません。
TMN

1
コードベースがやや「若い」(約6か月前、いくつかの主要なリファクタリングが行われている)という事実は、このことの指標となる可能性があります。
-joshin4colours

10
@ joshin4colours誰かが大規模な機能を書いている間にリファクタリングしていると、問題が発生します。
ショーンマクサムシング

17

「fetch-rebase-push」ワークフローに慣れています。実際には、チュートリアルで説明されている最初で最も原始的なワークフローは次のとおりです。

  • 真の継続的インテグレーション
  • 早期の競合管理-コードを作成してテストした直後
  • 迅速な応答-「おい、ボブ、あなたが書いたキュービック補間はおかしな出力を与えている。昼食中にそれを見てくれないか?」
  • マージコミットなし-1人の開発者がeverithyngを書いたかのようにタイムラインをきれいにする

さて、複雑なマージの競合について。頻繁な合併複雑な合併の両方がどのように発生するかはわかりません。複雑さは、長い間リベース/チェリーピッキングを行わず、1か月だけその機能に取り組んでいることに起因します。

私は個人的には、まれですべてを網羅するマージの恐怖よりも、頻繁に起こりやすいマージ(実際にはリベース)の競合に対処することを好みます。


1
優れたGitワークフローの素晴らしい説明ですが、これは私の質問にはまったく答えません。
joshin4colours

2
@joshyこれは本当です。中間の段落のみが質問に対処します。しかし、ここに直接答えがあります。マージが頻繁困難な場合、これは間違いなく問題のあるワークフロー/通信の問題/アーキテクチャの問題/部門または役割の問題を示しています。
ヴォラック

7

マージとリベースは、人間が解決しなければならない固有の競合(つまり、同じコード行を変更する2人の開発者)に対して、まったく同じ競合を引き起こすはずです。他の競合については、実際には、マージがよりクリーンになる傾向があります。これは、コミットのSHA-1を至る所で変更していないためです。マージがリベースよりも多くの競合を引き起こす状態にどのように対処しているのかわかりませんが、それは確かに一部の人々のワークフローが台無しになっていることの兆候であり、おそらくGitがどのように機能するかについてより多くのトレーニングが必要です。ローカルリベースを行うときに、他の人のマージコミットを削除するのでしょうか、それともそのようなことですか?

pull-rebaseメソッドの利点と欠点は、多くの人が慣れている集中型ワークフローに非常に似ていることです。使用するために分岐を理解する必要はありません。

とにかく、他の人にサインオンしてもらうことができない場合、ローカルでのみ機能ブランチワークフローを実行することは完全に実行可能です。


5

私が取り組んでいるプロジェクトには、この種の問題が時々あり、それはいくつかの要因に起因するようです:

  • 私たちはVisual Studioを使用しており、Visual Studio .slnのようなファイルは、XMLドキュメント(テキストマージに十分に応答しない)であり、Gid(Gitは他の人よりも理解しにくい)であり、簡単に理解できますひどくマージされ、ファイルが失われます。
  • 一部の人々はコードの同様の領域で作業しているため、プッシュされる変更はクラス内で隣り合わせになります。この状況では避けられませんが、このタイプの構成は、ソース管理システムにとって非常に大変な作業です。チーム内で優れたコミュニケーションが取れていても、人々はお互いのコードにぶつかり、競合が発生することに気付かないことがあります。

Semantic Mergeがこれらの問題のいくつかを支援する可能性に興味がありますが、それは明らかに、解析できる言語で作業していて、私がまだ重大な課題に直面していない場合にのみ使用されますそれを使っているので、その効果を保証することはできません。


4

開発者が(純粋なマージではなく)過去のコミットを変更しない限り、機能ワークフロータイプのgitモデルでの競合は、密結合コードベース(/ brandnewコードベース)または重複する機能割り当ての兆候です。


0

メイン(マスター)ブランチがあり、全員が機能ブランチで作業しています。

機能ブランチでの作業には、数時間から数ヶ月かかることがあります。

時々誰かが自分の変更セットをメインブランチに逆マージします。チームリーダーは、一度に1人だけが逆マージを実行するようにする必要があります。これが完了したら、メインブランチから機能ブランチにマージを転送する必要があります。すべての人が前方マージを実行すると、別の人がメインブランチへのリバースマージを許可されます。そうしないと、あまりにも多くの変更がリバースマージされ、フォワードマージで多数のマージ競合が発生します。

用語を明確にするために、「逆マージ」とは機能ブランチからメインブランチへのマージを意味し、「順マージ」とはメインブランチから機能ブランチへのマージを意味します。私が以前に経験したことに基づいて、フォワードマージとは対照的に、リバースマージでより多くのマージ競合が発生する可能性があります。


1
メインブランチへのマージは、決して競合してはいけませ。最初にmainを機能にマージするので、mainへの機能は競合しません。
gnasher729

@ gnasher729- それがこの答えの言っていることだと思う -私が見るように、提案はすべての開発者がメインから機能ブランチに誰かが何かをコミットするたびにマージするため、競合はすべて機能ブランチですぐに解決されます。
ペリアタブレアッタ

彼は、「あなたは機能からマスターにマージする競合を持っている可能性が高い」と述べました
-gnasher729

0

役立つ可能性のある2つのこと:1つは、独自に変更を加えるツールを使用しないでください。異なるタブ設定を使用する2人の開発者は、災害のレシピです。2つ目は、異なる場所で変更を加えます。たとえば、3人の開発者が同じファイルの最後にコードを追加すると、問題が発生します。別の場所にコードを追加すると、はるかに優れています。

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