- Published on
Gitのブランチ戦略
- Authors
- Name
Fork したリポジトリを最新の状態に更新する方法
GitHub でリポジトリを Fork すると、オリジナルのリポジトリ(以下「アップストリームリポジトリ」または「上流リポジトリ」)をコピーして自分のリポジトリ(以下「フォークリポジトリ」)として管理できる。しかし、時間が経つとアップストリームリポジトリが更新され、フォークリポジトリとの差分が生じることがある。
本記事では、アップストリームリポジトリの最新の内容をフォークリポジトリに反映する方法を、merge
と rebase
の 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 のどちらかを使用する。
merge
を使う方法(安全な方法)
🔹 3.1 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.
この場合、競合を手動で解決する必要がある。
- 競合のあるファイルを開く(
git status
で確認可能)。 <<<<<<< HEAD
と>>>>>>> upstream/main
で囲まれた部分を適切に修正。- 修正後、競合解決をコミットする。
git add src/example.py
git commit -m "Merge conflict resolved"
- 再度
git merge
を試す。
rebase
を使う方法(履歴をきれいに保つ方法)
🔹 3.2 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 したリポジトリを最新の状態に更新するには、以下の手順を実施する。
- Fork 元のリポジトリを
upstream
として追加 - Fork 元の最新の変更を取得(
git fetch upstream
) - Fork 先のブランチを更新(
merge
またはrebase
を選択) - 必要なら作業ブランチにも反映(
merge
orrebase
)
安全な方法: merge
を使う。
履歴をきれいにする方法: rebase
を使う(ただし慎重に)。
この手順を覚えておけば、Fork したリポジトリを最新の状態に保ち、スムーズな開発を続けられる。