Gitを使い始めてしばらく経つと、originとupstreamという2つのリモートリポジトリ名が登場します。「originは聞いたことあるけどupstreamって何?」「fork開発でどう使い分けるの?」と混乱する方も多いはずです。
この記事では、originとupstreamの違いを整理し、OSSへのコントリビュートや複数人開発でよく使われるfork開発フローを例に、両者の役割と実践的な使い方を徹底解説します。
- originとupstreamそれぞれの意味と役割
- upstreamの設定・確認・変更・削除コマンド
- fork開発フローの全体像とPR作成の流れ
- upstreamから最新変更を取り込む同期方法(fetch/merge/rebase)
- リモートを使いこなすその他の便利コマンド
originとは何か
originは、git cloneを実行したときに自動的に設定されるリモートリポジトリのデフォルト名です。cloneしたURLに対してoriginという名前が付けられます。
通常の個人開発では、originはGitHub・GitLab等の自分のリポジトリを指します。fork開発においては、自分のforkリポジトリ(アカウント名/リポジトリ名)がoriginになります。
originを確認する
git remote -v
origin https://github.com/your-name/project.git (fetch) origin https://github.com/your-name/project.git (push)
git remote -vコマンドでfetch用とpush用のURLが表示されます。これがoriginです。
originへのpush
ローカルの変更を自分のリモートリポジトリに反映するときはgit push origin ブランチ名を使います。
git push origin main git push origin feature/my-feature
upstreamとは何か
upstreamは、forkした元の本家リポジトリを指すリモート名として慣習的に使われます。GitHubでOSSプロジェクトをforkした場合、オリジナルのリポジトリ(例: facebook/react)がupstreamになります。
git cloneでは自動設定されません。手動で追加する必要があります。upstreamは直接pushすることはできません(権限がないため)。あくまでも最新の変更を取得(fetch/pull)するために使います。
fork開発における全体像
本家リポジトリ (upstream)
facebook/react
|
| fork
v
自分のforkリポジトリ (origin)
your-name/react
|
| clone
v
ローカルリポジトリ
この3層構造を頭に入れておくと、originとupstreamの役割がすっきり理解できます。
upstreamを設定する方法
GitHubで本家リポジトリをforkしてクローンした後、以下のコマンドでupstreamを追加します。
upstreamを追加する
git remote add upstream https://github.com/original-owner/project.git
upstreamという名前は慣習ですが、任意の名前を使うこともできます(ただしupstreamが業界標準)。
設定を確認する
git remote -v
origin https://github.com/your-name/project.git (fetch) origin https://github.com/your-name/project.git (push) upstream https://github.com/original-owner/project.git (fetch) upstream https://github.com/original-owner/project.git (push)
originとupstreamの2つが表示されれば設定完了です。upstreamのpush URLは表示されますが、実際には権限がないためpushはできません。
git remote add upstream git@github.com:original-owner/project.git典型的なFork開発フロー
OSSへのコントリビュートやチーム開発でよく使われるfork開発の標準的な流れを説明します。
Step 1: 本家リポジトリをforkしてclone
# GitHubでfork後、自分のforkリポジトリをclone git clone https://github.com/your-name/project.git cd project
Step 2: upstreamを追加
git remote add upstream https://github.com/original-owner/project.git
Step 3: 作業ブランチを作成
git checkout -b feature/add-new-feature
Step 4: 変更を加えてcommit・push
git add . git commit -m "feat: add new feature" git push origin feature/add-new-feature
Step 5: GitHubでPull Requestを作成
GitHubのWeb画面で 自分のfork → 本家リポジトリ へのPull Requestを作成します。PRのベースブランチには本家のmain/masterブランチを指定します。
upstreamから最新を取り込む方法(同期)
本家リポジトリが更新されたとき、自分のforkと作業ブランチを最新状態に保つ必要があります。主に2つの方法があります。
方法1: fetch + merge(推奨)
# 本家の最新情報を取得 git fetch upstream # mainブランチに切り替え git checkout main # upstreamのmainをマージ git merge upstream/main # 自分のfork(origin)にも反映 git push origin main
git fetch upstreamは変更情報をダウンロードするだけでローカルブランチには影響しません。git merge upstream/mainで初めてローカルに反映されます。方法2: pull(短縮形)
git checkout main git pull upstream main git push origin main
git pull upstream mainはfetch + mergeを一度に行います。シンプルですが、fetchとmergeのステップが分かりにくくなるため、慣れないうちは方法1が推奨です。
方法3: rebaseを使う
git fetch upstream git checkout main git rebase upstream/main git push origin main
rebaseを使うと、コミット履歴を一直線に保てます。OSSプロジェクトによってはrebaseが推奨されることもあります。mergeとrebaseの詳細については【Git】rebaseとmergeの違いと使い分けを参照してください。
git rebase mainまたはgit merge mainを実行します。origin・upstreamの使い分けまとめ
| 項目 | origin | upstream |
|---|---|---|
| 指すリポジトリ | 自分のforkリポジトリ | fork元の本家リポジトリ |
| 自動設定 | clone時に自動設定 | 手動で追加が必要 |
| push | できる(git push origin) |
通常できない(権限なし) |
| fetch/pull | できる | できる(最新取得に使う) |
| 主な用途 | 自分の変更をpush・PRの元として使う | 本家の最新を同期する |
| 命名 | cloneで自動的に付く名前 | 慣習的な名前(変更可能) |
upstreamを削除・変更する方法
upstreamを削除する
upstreamが不要になった場合や間違えて設定した場合は削除できます。
git remote remove upstream
削除後にgit remote -vで確認するとupstreamが消えています。
upstreamのURLを変更する
本家リポジトリのURLが変わった場合や間違えたURLを設定した場合はset-urlで変更できます。
git remote set-url upstream https://github.com/new-owner/project.git
リモート名を変更する
git remote rename upstream upstream-old
git remote remove originやgit remote set-url origin <新しいURL>でoriginも変更できます。リモートを使いこなすその他のコマンド
全リモートを一括取得
git fetch --all
originとupstream両方の最新情報を一度に取得できます。複数のリモートを管理している場合に便利です。
リモートブランチ一覧を確認
git branch -r
origin/HEAD -> origin/main origin/main origin/feature/old-feature upstream/main upstream/develop
-rオプションでリモート追跡ブランチ(remote tracking branch)がすべて表示されます。upstreamのブランチも確認できます。
リモート情報の詳細確認
git remote show upstream
upstreamのブランチ一覧、HEAD、追跡状態などの詳細情報が表示されます。
不要なリモート追跡ブランチを削除
git remote prune origin git remote prune upstream
リモートで削除されたブランチの追跡情報をローカルからクリーンアップできます。
よくある質問(FAQ)
git pull upstream mainはfetchとmergeを一度に行うショートカットです。git fetch upstream単独ではローカルブランチは変化しません。初心者はfetch + mergeの2ステップで学ぶと動作が理解しやすいです。git addとgit commitでコンフリクト解消を記録します。詳細は【Git】コンフリクトしてpullできないときの対処法完全ガイドを参照してください。関連記事
- 【Git】コンフリクトしてpullできないときの対処法完全ガイド
- 【Git】rebaseとmergeの違いと使い分け
- 【Git】revertとresetの違いと使い分け
- 【Git】リモートとローカルの履歴が食い違ったときの同期方法
- origin = 自分のforkリポジトリ。cloneで自動設定。push/pullどちらも自由に使える
- upstream = fork元の本家リポジトリ。手動設定が必要。fetchで最新を取得する
- fork開発フロー: ローカル ↔ origin(自分のfork) → upstream(本家)へPR
- 本家の最新を取り込むには
git fetch upstream→git merge upstream/main - rebaseを使うと履歴が一直線になりPRレビューがしやすくなる

