質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.93%

Git 複数人でブランチマージを対応したい。

受付中

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 2,842

score 10

前提・実現したいこと

お世話になります。
複数人でのブランチマージにおける運用についてご意見を聞かせてください。

以下2つのブランチが存在したとします。
・dev1
・dev2
※masterから派生し、製品が違うようなブランチです。

dev1,dev2は同時に開発が進み、途中で共通機能/不具合の反映のため、
dev1→dev2にマージを行うとします。
代表者がgit mergeを行いますが、担当ではないファイルのコンフリクトが発生します。

ブランチのマージ対応で自分以外のファイルがコンフリクトを起こした場合、
皆様どのように運用しているのでしょうか?

考えられるケース(1)

マージ対応中の作業ツリーに各担当者に入ってもらい、コンフリクトファイルを解消してもらう。

考えられるケース(2)

コンフリクトリストを展開して解消版のファイルを代表者宛に送ってもらう。
マージ代表者は、そのファイルを元に、マージを完了させる。

本当はこうしたいが出来るのかな?

上記ケースは、接続環境や人数規模の関係で適用が難しいです。
そもそも、コンフリクト解消は、各自の作業ツリーで対応したいです。

例えば、以下のようなことはGit単体で可能なのでしょうか?
[1]マージ代表者は、マージ用の仮ブランチを作成して、git mergeを行う。
[2]マージ代表者は、自動マージ出来たファイルを先行してcommit, pushする。
[3]各担当者は、コンフリクト解消依頼を受け、自分の作業ツリーで未解消分の対応を行いcommit,pushする。

試した内容は次の通りです。
[1][2]の操作として、
git checkout dev2
git checkout -b dev2_merge
git merge dev1
git reset <コンフリクトファイル> ← コンフリクトファイルがあるとコミット出来ないため
git commit -m "merge1"
git push -u origin dev2_merge

次が[3]の操作として、
git checkout dev2_merge
git merge dev1
→ 「Already up to date.」を表示され、マージは出来ない。
期待としてコンフリクト未解消ファイルが表示され、担当ファイルだけ解消/commit/push出来ると良かった。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+4

こんにちは。

同じソースを複数の人が修正するということと思います。
それがコンフリクトした場合、その修正理由をマージ担当者が把握していればマージ担当者によるコンフリクト解消も可能と思いますが、自分が担当していない修正全てについて把握するのは、現実問題不可能ではないでしょうか?
ソース修正を担当した人同士が話し合って、コンフリクトを解消するのが最も効率的と思います。

となると、下記は本当に妥当なのでしょうか?

以下2つのブランチが存在したとします。
・dev1
・dev2
※masterから派生し、製品が違うようなブランチです。

同じソースをメンテナンスする人たちは、お互いに密に連携して当該ソースをメンテナンスする必要があります。同じブランチなら、頻繁にプッシュ→プルしたり、お互いにプルリクするしたりなど、問題を軽減する仕組みを構築することが可能と思います。しかし、別ブランチにした場合、相手のブランチに対してプルリクを出すとか、頻繁にプッシュ→プルするなどは、ちょっと厳しいだろうと感じます。つまり、共通のソースを別のブランチで管理するのはあまりよろしくない使い方ではないかと思います。

私が見たことのある巨大なオープンソースプロジェクトは、llvmやboost、Qtなどがあります。全て、複数のプラットフォームに対応していますが、プラットフォーム毎にブランチが別れたりせず、1つのマスター・ブランチで全てのプラットフォームに対応しています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/25 11:30

    ご回答ありがとうございます。

    前提の構成に突っ込みどころがあるのはわかりますが、
    実際には、ブランチ毎に品質を担保したい等で分けるケースもあるかと思います。

    Gitで多人数によるブランチマージを進める手順としては、
    ケース(1)(2)しか方法が無いのでしょうか。

    キャンセル

  • 2018/12/25 15:00 編集

    > 実際には、ブランチ毎に品質を担保したい等で分けるケースもあるかと思います。

    なるほど。

    ならば、マージが発生しうる共通部分をサブモジュール化して管理すると、コンフリクト解消はサブモジュールへのコミット時に担当者にて記憶の新しい内にこまめに行なえますし、その結果の各製品への反映タイミングは製品側で決定できますので品質の担保も行いやすいと思います。
    https://qiita.com/sotarok/items/0d525e568a6088f6f6bb

    ところで、Gitはフローをうまく設計しておかないと、使いにくくなります。GitHub Flow、GitLab Flow、Git Flowが有名です。(後ろに行くほどより大規模なプロジェクトをより高信頼性で管理することを目指したフローです。)これらを参考にされた方が管理しやすくなるだろうと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る