Published on

Gitのブランチ戦略

Authors
  • Name
    Twitter

Fork したリポジトリを最新の状態に更新する方法

GitHub でリポジトリを Fork すると、オリジナルのリポジトリ(以下「アップストリームリポジトリ」または「上流リポジトリ」)をコピーして自分のリポジトリ(以下「フォークリポジトリ」)として管理できる。しかし、時間が経つとアップストリームリポジトリが更新され、フォークリポジトリとの差分が生じることがある。

本記事では、アップストリームリポジトリの最新の内容をフォークリポジトリに反映する方法を、mergerebase の 2 つの方法で詳しく解説する。


1. アップストリームリポジトリをリモートリポジトリとして追加

まず、アップストリームリポジトリを upstream という名前でリモートリポジトリとして登録する。

# アップストリームリポジトリを upstream として追加
git remote add upstream <アップストリームリポジトリのURL>

追加できたかどうかは、以下のコマンドで確認できる。

git remote -v

表示例:

origin    https://github.com/your-username/repository.git (fetch)
origin    https://github.com/your-username/repository.git (push)
upstream  https://github.com/original-owner/repository.git (fetch)
upstream  https://github.com/original-owner/repository.git (push)

これで、Fork 元(upstream)と Fork 先(origin)の両方をリモートリポジトリとして管理できるようになる。


2. Fork 元の最新の変更を取得

Fork 元の最新の変更をローカルに取得するには、次のコマンドを実行する。

git fetch upstream

この操作により、Fork 元の main ブランチ(または他のブランチ)の最新の変更がローカルに取得される。


3. Fork 元の変更を Fork 先に反映する

Fork 元の最新の変更を Fork 先に反映するには、merge または rebase のどちらかを使用する。

🔹 3.1 merge を使う方法(安全な方法)

merge を使う場合、現在の main に Fork 元の変更を統合する。

git checkout main  # メインブランチに移動
git merge upstream/main  # Fork元の変更をマージ

この方法では、Fork 先の main に Fork 元の変更が統合される。履歴がそのまま残るため、他の開発者との共同作業でも比較的安全である。

変更をリモートに反映するには、次のコマンドを実行する。

git push origin main

⚠️ merge で競合(コンフリクト)が発生した場合

merge を実行すると、以下のようなメッセージが表示されることがある。

Auto-merging src/example.py
CONFLICT (content): Merge conflict in src/example.py
Automatic merge failed; fix conflicts and then commit the result.

この場合、競合を手動で解決する必要がある。

  1. 競合のあるファイルを開く(git status で確認可能)。
  2. <<<<<<< HEAD>>>>>>> upstream/main で囲まれた部分を適切に修正。
  3. 修正後、競合解決をコミットする。
git add src/example.py
git commit -m "Merge conflict resolved"
  1. 再度 git merge を試す。

🔹 3.2 rebase を使う方法(履歴をきれいに保つ方法)

rebase を使うと、Fork 先の main にある変更が Fork 元の main の最新の履歴の上に並べ替えられる。

git checkout main
git rebase upstream/main

この操作により、Fork 先で行った変更が 最新の upstream/main の履歴の上に適用し直される

rebase を使う場合の注意点

  • 競合(コンフリクト)が発生した場合、手動で修正する必要がある。
    • 競合解決後、git rebase --continue で処理を続行。
    • git rebase --abort で rebase をキャンセル可能。
  • rebase 後に git push origin main するとエラーが発生する可能性がある。
    • その場合、次のコマンドで強制プッシュ。
    git push --force-with-lease origin main
    

4. 作業ブランチ(feature-branch)への反映

Fork 先の main を最新にしたら、作業ブランチ(例: feature-branch)にも変更を反映する必要がある。

merge の場合

git checkout feature-branch
git merge main

rebase の場合

git checkout feature-branch
git rebase main

これで作業ブランチが最新の main に追従するようになる。


5. どの方法を選ぶべきか

状況merge 推奨rebase 推奨
Fork 先の main に変更がない
main に直接変更を加えている❌(要注意)
チームで開発している❌(rebase は履歴を書き換えるため)
きれいな履歴を保ちたい
  • 安全に行うなら merge(履歴がそのまま残る)
  • 履歴をきれいに保ちたいなら rebase(ただし push --force-with-lease が必要)

6. まとめ

Fork したリポジトリを最新の状態に更新するには、以下の手順を実施する。

  1. Fork 元のリポジトリを upstream として追加
  2. Fork 元の最新の変更を取得git fetch upstream
  3. Fork 先のブランチを更新merge または rebase を選択)
  4. 必要なら作業ブランチにも反映merge or rebase

安全な方法: merge を使う。

履歴をきれいにする方法: rebase を使う(ただし慎重に)。

この手順を覚えておけば、Fork したリポジトリを最新の状態に保ち、スムーズな開発を続けられる。