proguradk
@proguradk

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

github マージ 疑問

解決したいこと

現在githubの共同開発について調べていて、githubについての疑問が生まれずっと考えていましたが解決できないため、質問させていただきます。

image.png

上記の写真の状況について質問させていただきます。

流れ

A、Bの二者が存在
mainから二人とも同時にブランチを切る
それぞれ変更を行う
変更内容はそれぞれ新しいファイルを作成しその中身を変更する(同じファイルの中身を変更しない)
Aが先に自分のタスクを完了させ、mainにプルリクエストを送信、マージを行う
後にBが自分のタスクを完了、mainにプルリクエストを送信、マージを行う

ここで疑問が生まれました。

疑問点

BがマージするときにBがマージするファイルにはAが作成、変更を行ったファイルが存在しない。つまり、Bがマージし、mainを上書きする際、Aの作成したファイルがなくなってしまうのではないかという疑問です。
しかし、この考えが正しければ、共同開発がうまくできないと考え、ずっと考えていました。
この点わかる方教えていただけないでしょうか??

0

3Answer

@simonritchie さん、

Aさんの方が先にmainにマージした場合、Bさんの方は基本的に一度pullとかしないとmainにマージできなくなるので、

そんなことはありませんよ。 main にブランチ1がマージされていて、ブランチ2にそのコミットが含まれていない場合でも、ブランチ2は main にマージできます。(コンフリクトしない限りは)

@proguradk さん、

Bがマージし、mainを上書きする際、Aの作成したファイルがなくなってしまうのではないかという疑問です。

実際にブランチを作ってマージしてみると分かると思いますが、基本的にはそうなりません。ブランチ1とブランチ2を順に main にマージするとき、 Git は可能な限りどちらの変更も main に含まれるようにします。AさんとBさんが別々のファイルを作ったならそれらは両方とも main に存在するようになるということです。2人が同じファイルの異なる行を変更した場合でも、大抵は両方の変更が残るようにうまくマージされます。

もう少し詳しい話をすると、この場合 Git は 3-way merge を行います。アルゴリズムの概略はこちらの Q&A で説明されていますので読んでみてください。 https://ja.stackoverflow.com/a/52020/2259

2Like

Comments

  1. @proguradk

    Questioner

    非常に分かりやすい回答ありがとうございます。
    二人ともの変更が反映されるのはなるほどでした。理解できました。
    ありがとうございました!!!

Aさんの方が先にmainにマージした場合、Bさんの方は基本的に一度pullとかしないとmainにマージできなくなるので、

Aさんがmainにマージ

Bさん側はpullしてAさんの更新分をBさん環境にマージする(もしくはBさんがプルリクなどを出して別の人がBさん作業分をマージする)

Bさん作業分がpullした結果でも大丈夫なことを確認する

Bさん作業分をmainにマージする

みたいな流れになるのでAさん作業分もBさん作業分も残る形となります!

1Like

Comments

  1. @proguradk

    Questioner

    なるほど!!pullしないといけないんですね!!
    ここでのpullは上書き保存するのではなく追加分だけ保存することができるのですか??
    マージ=上書き保存
    プル=追加分保存
    という理解であってますか??
  2. @proguradk

    Questioner

    もしくわBさんがプルリクの部分がよくわからないのですが、プルリク出して違う人がマージというのが理解できないです。理解力ぶそくですみません。。
  3. @usai さんがおっしゃるように、私の解答でちょっと正しくない点もあったのでそちらもご確認ください!

    > ここでのpullは上書き保存するのではなく追加分だけ保存することができるのですか??


    基本的にその辺りはgit側で上書き保存ではなくAさんBさんの作業分が統合される形となります!例えば同じファイルで5行目をAさんが更新して、10行目をBさんが更新した場合にはそれぞれの更新分が残る形になります!

    AさんとBさんが同じ行を編集してしまった場合にはコンフリクト(conflict / 衝突・競合といった意味になります)となって、手作業で「どういった形に最終形をするか・どちらの人の作業分を残すのか」といった作業が別途必要になります!

    あまりgitにそこまで精通しているわけではないので若干語弊があるかもしれませんが、pullの方は「引っ張る」という意味から分かるように「他のブランチ(他人の作業分)を引っ張って持ってきて、自分のブランチにマージする」という挙動になるのでpullとmergeが別物というよりかはpull自体でもマージがされます!

    > もしくわBさんがプルリクの部分がよくわからないのですが、プルリク出して違う人がマージというのが理解できないです。理解力ぶそくですみません。。

    例えば、とあるライブラリのリポジトリがあったとして、そのライブラリの所有者が通常はいらっしゃいます。その所有者以外の方が「こんな機能が欲しい」と思ってコードを書いてプルリクを出したりすることもたくさんあります。

    そういった時に、そのライブラリの所有者が既存のコードとマージ(統合)したりしてテストして、問題が無さそうであればmainに反映する・・・みたいなことを指しておりました!(ちょっと説明が分かりづらかった感じもするので、この辺は今回の質問ではあまり気にしなくてもいいかもしれません・・・!)
  4. @proguradk

    Questioner

    詳しく解説していただきありがとうございます。
    お二方の回答で十分に理解することができました!!
    これからGIT使っていけそうです!!
    ありがとうございました!!!

Your answer might help someone💌