【Git】originとupstreamの違いと使い分け完全ガイド|fork開発・PR・同期まで

【Git】origin と upstream の違いと使い分け方 Git

Gitを使い始めてしばらく経つと、originupstreamという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
ポイント: originは「自分が直接push/pullできる自分のリモートリポジトリ」と理解しましょう。

upstreamとは何か

upstreamは、forkした元の本家リポジトリを指すリモート名として慣習的に使われます。GitHubでOSSプロジェクトをforkした場合、オリジナルのリポジトリ(例: facebook/react)がupstreamになります。

注意: 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はできません。

SSHでのupstream設定: HTTPSの代わりにSSH URLも使えます。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ブランチを指定します。

PRの作成方向: origin(自分のfork)からupstream(本家)へ向かってPRを出す。これがfork開発の基本です。

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
fetchとpullの違い: 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の違いと使い分けを参照してください。

作業ブランチへの適用: 作業中のfeatureブランチにもupstreamの変更を取り込みたい場合は、mainをrebase/mergeした後、featureブランチに対して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
originの削除・変更も同様: git remote remove origingit 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

リモートで削除されたブランチの追跡情報をローカルからクリーンアップできます。

リモートとローカルの履歴が食い違った場合の対処法は【Git】リモートとローカルの履歴が食い違ったときの同期方法も参考にしてください。

よくある質問(FAQ)

originとupstreamは名前を変えても使えますか?
はい、名前は任意です。ただしoriginとupstreamは業界標準であり、チームメンバーやOSSコントリビューターとの共通認識として使うことが強く推奨されます。独自名を使うと混乱の元になります。
upstreamへpushできないのはなぜですか?
forkした本家リポジトリへの書き込み権限は、一般的にはありません。変更を反映するにはPull Requestを通じてメンテナに承認してもらう必要があります。pushできるのは自分が所有・管理しているoriginのみです。
git pull upstream mainとgit fetch upstream + git merge upstream/mainの違いは?
git pull upstream mainはfetchとmergeを一度に行うショートカットです。git fetch upstream単独ではローカルブランチは変化しません。初心者はfetch + mergeの2ステップで学ぶと動作が理解しやすいです。
forkせず直接cloneした場合、upstreamは必要ですか?
直接cloneした場合(fork不要の場合)、upstreamを設定する必要は通常ありません。upstreamは主にfork開発フローで使う概念です。個人の非fork開発ではoriginだけで完結します。
コンフリクトが発生した場合はどう対処しますか?
upstreamからmergeした際にコンフリクトが発生した場合は、競合ファイルを手動で修正し、git addgit commitでコンフリクト解消を記録します。詳細は【Git】コンフリクトしてpullできないときの対処法完全ガイドを参照してください。

関連記事

まとめ: originとupstreamの使い分けポイント

  • origin = 自分のforkリポジトリ。cloneで自動設定。push/pullどちらも自由に使える
  • upstream = fork元の本家リポジトリ。手動設定が必要。fetchで最新を取得する
  • fork開発フロー: ローカル ↔ origin(自分のfork) → upstream(本家)へPR
  • 本家の最新を取り込むにはgit fetch upstreamgit merge upstream/main
  • rebaseを使うと履歴が一直線になりPRレビューがしやすくなる