git pull origin developでコンフリクトしなかったのに、なぜupstream mergeでコンフリクトした?フォーク運用の落とし穴と対策

Git

git

kamiです。
TwitterYoutubeもやってます。

今回はgit pull origin developでコンフリクトしなかったのに、なぜupstream mergeでコンフリクトした?フォーク運用の落とし穴と対策の紹介です。

結論

大体のことはこれで解決します。

git fetch upstream
git merge upstream/develop
icon

フォークのコンフリクトについては以下を読んでいけば理解が深まります。

git pull origin developでコンフリクトしてないのに、コンフリクトと言われた

フォークしたリポジトリで作業していて、git pull origin developでコンフリクトしてないのに、コンフリクトと言われた経験ありませんか?

  • git pull origin develop → コンフリクトなし、問題なし
  • PR出そうとしたら「コンフリクトしてます」と言われる
  • git merge upstream/develop → 突然コンフリクト発生!
icon

「さっきまで大丈夫だったのに…」

と混乱した経験、私にもあります。 この記事では、なぜこういうことが起きるのか、そしてどう対策すればいいのかを解説します。

スポンサードサーチ

フォークとは?

まず基本から。フォーク = リポジトリのコピーを自分のGitHubアカウントに作ることです。

本家リポジトリ (組織のリポジトリ)
    ↓ フォーク
自分のリポジトリ (個人のリポジトリ)

なぜフォークするかというと:

  1. 本家に直接pushする権限がない
  2. 自分専用の作業場所が必要
  3. 本家を汚さずに開発できる

リモートリポジトリの関係性

フォーク運用では、通常2つのリモートリポジトリを扱います:

upstream (本家)
organization/repository
├── develop ← みんなのPRがここにマージされる
└── 常に最新の状態

origin (自分のフォーク)
your-account/repository
├── develop ← 本家と同期しないと古くなる
└── feature/xxx ← 作業ブランチ

スポンサードサーチ

問題が起きる仕組み

git pull origin develop でコンフリクトしない

git pull origin develop
# = git fetch origin + git merge origin/develop

これは自分のフォークから取得しているだけです。

自分のフォーク (origin/develop) ← 古い状態
  ↓ pull
作業ブランチ ← 古いものとマージするだけ

自分のフォークには他の人のPRがマージされていないので、コンフリクトしません。

git merge upstream/develop でコンフリクト発生

git merge upstream/develop

これは本家の最新状態とマージしようとしているわけです。

本家 (upstream/develop) ← 他の人のPRがマージ済み
  ↓ merge
作業ブランチ ← 同じファイルを変更していたらコンフリクト!

対策: コンフリクトを事前に防ぐ方法

基本戦略: 常に本家と同期する

# 作業開始前に必ず実行
git fetch upstream
git merge upstream/develop

これを毎日作業開始時、またdevelopなどの更新日が決まっている時間の後に実行するだけで、コンフリクトのリスクが大幅に減ります。

なぜ効果があるのか

  1. 他の人の変更を早めに取り込める
  2. コンフリクトが発生しても早期に発見できる
  3. 小さなコンフリクトのうちに解消できる

おすすめワークフロー

# 1. 朝一番、または作業開始時
git checkout develop
git fetch upstream
git merge upstream/develop

# 2. 作業ブランチに反映
git checkout feature/your-branch
git merge develop

# 3. コンフリクトがあれば解消

# 4. 作業開始!

スポンサードサーチ

応用: 事前確認のテクニック

マージせずにコンフリクトだけ確認

# コンフリクトするか確認したい
git fetch upstream
git merge --no-commit --no-ff upstream/develop

# コンフリクトがあれば表示される
# 確認後、中止
git merge --abort

本家との差分を確認

# どのファイルが変わっているか
git diff upstream/develop...HEAD --name-only

# 自分の独自コミットを確認
git log upstream/develop..HEAD --oneline

まとめ

重要なポイント

  1. origin = 自分のフォーク、upstream = 本家 と覚える
  2. PRは本家にマージされる ので、originだけ見ていても意味がない
  3. 定期的に git fetch upstream && git merge upstream/develop を実行する

やってはいけないこと

  • git pull origin develop だけで満足する
  • ❌ 何日も本家と同期せずに作業を続ける
  • ❌ PR出す直前に初めて本家と同期する

やるべきこと

  • ✅ 作業開始時に本家と同期
  • ✅ 定期的に(毎日/毎週)本家と同期
  • ✅ コンフリクトは早めに解消

さいごに

フォーク運用は便利ですが、origin と upstream の違いを理解していないと、思わぬところでコンフリクトに悩まされます。

「コンフリクトは避けられない」ではなく「早めに発見して早めに解消する」 という考え方にシフトすると、開発がずっとスムーズになります。

この記事が、フォーク運用で悩んでいる誰かの助けになれば幸いです。


関連記事

  • Gitのマージとリベースの使い分け
  • コンフリクト解消のベストプラクティス
  • チーム開発でのブランチ戦略

Git

Posted by kami