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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Q&A

1回答

20497閲覧

gitで同一ファイルを複数人で編集した場合の衝突

tixure55

総合スコア400

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

0グッド

2クリップ

投稿2015/11/03 04:58

gitで同一ファイルを複数人で編集した場合の衝突について質問です。

a.phpには既存コードが100行載っているとします。

a.phpをAさんがブランチhogeで編集していて、コードを1行目から100行目まで追加し、git commitしました。

同時にa.phpをBさんがブランチtestで編集していて、50行目のコードを改修し、git commitしました。

CさんがAさんのソースをマージしたく、masterブランチからgit merge hogeしました。その後、Bさんが改修してくれたソースをマージしたく、masterブランチからgit merge testを実行しました。このgit merge testは衝突でエラーになりますか?また、衝突させずに済む方法があれば教えてください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

このgit merge testは衝突でエラーになりますか?

修正した内容によります。

修正した箇所が重複していなければ衝突せずにマージできますし、さもなくばマージできない場合があります。

衝突させずに済む方法があれば教えてください

マージストラテジーを使用すれば、衝突を回避することはできます。
https://git-scm.com/docs/git-merge

sh

1 # 衝突したら、"our version"(たいていの場合、カレントブランチのこと)の内容を優先してマージする 2git merge -s ours test 3 4# "ours"オプションの逆 5git merge -s theirs test

ただし、これは衝突の内容を一切考慮せず、機械的にマージするだけなので、
マージした結果が期待通りになるとは限りません。

テスト用ブランチを作成してテストしてみる

以下のようにすれば、masterブランチに一切影響を与えず、masterブランチへのマージのテストを行なうことができます。

sh

1# masterブランチからマージテスト用ブランチを作成し、そこにチェックアウトする。 2git checkout -b merge_test master 3 4# merge_testブランチにhogeブランチをマージする 5git merge hoge 6 7# merge_testブランチにtestブランチをマージする 8git merge test

投稿2015/11/03 07:48

編集2015/11/03 08:30
KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tixure55

2015/11/03 08:16

回答ありがとうございます、つまりgitは厳密に同じ行番号のコードを機械的に比較して衝突と判断するのではなく、違う行に書いてあっても内容が同じ行があれば、「これは上部にソースコードが追加されたからだ」と判断できるという認識でよろしいのでしょうか? 具体的にいうと、今回の例では、git merge hogeした時点のmasterの50行目はAさんの追加したソースコードでBさんのブランチの50行目は明らかに異なるソースになるはずです。しかし、それが衝突しない場合があるということは、gitがただ機械的に行番号だけの比較で衝突を検知しているとは思えないという判断になるからです。 「修正した箇所が重複していなければ衝突せずにマージできます」とおっしゃっていますが、それはBさんが修正した箇所(50行目)をAさんがいじっている場合でしょうか。 例:masterのソース(計200行)の150行目(testブランチの50行目に該当)が$a = 10;   testブランチのソースの50行目が$a = 0;(Bさんの編集によって10から0へ編集された) 上の例は衝突しますか?
KiyoshiMotoki

2015/11/03 08:31 編集

判断いたしかねます。 ご質問の内容ですと修正箇所は重複していないようですし、 gitは行番号だけを見ているわけではないので理論的には衝突せずマージできそうですが、 私の経験では、(追加も含む)修正した行が多いと、衝突していない箇所を"衝突"と誤検知することがありましたので。 実際にこのような状況でお困りなのでしたら、 テスト用のブランチを作成して実際に試してみるのが安全かつ確実です。 回答にコマンドを追記させていただきます。
sho_cs

2015/11/03 08:34

gitがデフォルトのマージアルゴリズムに採用している3-way mergeというアルゴリズムについて調べてみると参考になるとおもいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問