31.

git remoteの使い方|add・set-url・originとupstreamの違い

編集
この記事の要点
  • git remote はローカルが知っている「リモート (リポジトリの別名)」を管理するコマンド
  • 基本: git remote -v で一覧、git remote add origin URL で追加、git remote rm name で削除
  • origin = 自分の fork や clone 元、upstream = 本家リポジトリ。OSS でよく使う 2 つ
  • URL 変更は git remote set-url origin URL (HTTPS↔SSH 切替や GitLab→GitHub 移行時)
  • fetch / pull / push でリモートとローカルの内容を同期。fetch はローカル変更に影響を与えず安全
  • 消されたリモートブランチを掃除: git remote prune origin または git fetch --prune

git remote とは

Git のリモート (remote)とは「ローカルリポジトリが認識している他のリポジトリの別名」のことです。git clone 直後は通常 origin という名前で clone 元が登録されます。

「リモート」は名前 ↔ URL の対応表に過ぎず、登録するだけでは何もダウンロードされません。実際の同期は fetch / pull / push で行います。

現在のリモート一覧を見る

# 名前だけ
git remote
# origin

# URL も
git remote -v
# origin  git@github.com:user/repo.git (fetch)
# origin  git@github.com:user/repo.git (push)

# 詳細 (HEAD ブランチ、トラッキング設定など)
git remote show origin
# * remote origin
#   Fetch URL: git@github.com:user/repo.git
#   Push  URL: git@github.com:user/repo.git
#   HEAD branch: main
#   Remote branches:
#     main     tracked
#     develop  tracked
#   Local branch configured for 'git pull':
#     main merges with remote main
#   Local refs configured for 'git push':
#     main pushes to main (up to date)

リモートを追加 / 削除

# 追加
git remote add origin git@github.com:user/repo.git

# 別名で追加 (本家を upstream として)
git remote add upstream git@github.com:original-owner/repo.git

# 削除
git remote rm origin
git remote remove origin   # rm の別名

# リネーム
git remote rename origin github

URL を変更する: set-url

HTTPS で clone したものを SSH に切り替えたい、Bitbucket から GitHub へ移管した、独自ドメインに変えた、などの場面で頻用します。

# 変更
git remote set-url origin git@github.com:user/repo.git

# push 専用に別 URL (fetch は元のまま)
git remote set-url --push origin git@github.com:user/repo.git

# 確認
git remote -v

典型的なフロー: clone から push まで

# 1. 既存リモートを clone
git clone git@github.com:user/repo.git
cd repo
git remote -v   # origin 登録済

# ―――― あるいは ――――

# 1'. ローカルで作って後からリモート登録
mkdir myproject && cd myproject
git init
echo "# myproject" > README.md
git add README.md
git commit -m "Initial commit"

# 2. GitHub などで空リポジトリを作っておき URL を控える

# 3. リモートを登録
git remote add origin git@github.com:user/myproject.git

# 4. 初回 push (-u で upstream 紐付け)
git branch -M main
git push -u origin main

# 5. 以後は短く
git push
git pull

fetch / pull / push の役割

コマンド動作ローカル変更への影響
git fetchリモートの最新を取り込む (origin/main 等の追跡ブランチを更新)★ なし (安全)
git pullfetch + 現在のブランチに merge (デフォルト) or rebaseあり (自動マージ)
git pushローカルのコミットをリモートに送る
git fetch --prunefetch + 消えたリモートブランチをローカル追跡から削除追跡情報のみ

origin と upstream: OSS で fork する場合

OSS にコントリビュートするときは、本家を upstream、自分の fork を origin として登録するのが定番です。

# 1. 自分の fork を clone (origin = fork)
git clone git@github.com:myuser/awesome.git
cd awesome

# 2. 本家を upstream として追加
git remote add upstream git@github.com:upstream-owner/awesome.git

git remote -v
# origin    git@github.com:myuser/awesome.git         (fetch/push)
# upstream  git@github.com:upstream-owner/awesome.git (fetch/push)

# 3. 本家の更新を取り込む (upstream → ローカル main → fork へ push)
git checkout main
git fetch upstream
git merge upstream/main
# または
git rebase upstream/main

git push origin main

# 4. 機能ブランチで作業 → fork へ push → PR
git checkout -b feature/x
# ... commit ...
git push -u origin feature/x

複数リモートの一例

# 同じプロジェクトを GitHub と GitLab の両方にバックアップ
git remote add github git@github.com:user/repo.git
git remote add gitlab git@gitlab.com:user/repo.git

# 個別に push
git push github main
git push gitlab main

# 両方に一度に push したい場合
# origin の Push URL を複数登録する技
git remote set-url --add --push origin git@github.com:user/repo.git
git remote set-url --add --push origin git@gitlab.com:user/repo.git
git push origin main   # 両方に飛ぶ

消えたリモートブランチを掃除

同僚がリモートでブランチを削除しても、ローカルの origin/branch は残り続けます。これを掃除するのが --prune です。

# Dry-run で何が消えるか確認
git remote prune origin --dry-run

# 実行
git remote prune origin

# fetch と同時に prune (こちらが手軽)
git fetch --prune
git fetch -p

# pull に統合
git config --global fetch.prune true   # 以後 fetch 時に常に prune

# それでもローカルブランチは残るので個別に削除
git branch -d feature/old   # マージ済みなら -d
git branch -D feature/old   # 未マージでも強制 -D

トラッキング (upstream) 設定

ローカルブランチがどのリモートブランチを追跡するかを設定すると、git push / git pull を引数なしで使えるようになります。

# 初回 push で紐付け
git push -u origin feature/x

# 既存ブランチに後から設定
git branch --set-upstream-to=origin/feature/x feature/x
git branch -u origin/feature/x   # 短縮形

# 確認
git branch -vv
# * feature/x abcd123 [origin/feature/x] commit msg
#   main       efgh456 [origin/main]      another commit

# 解除
git branch --unset-upstream

よくあるトラブル

症状原因対処
fatal: remote origin already exists.add しようとしたが既にあるgit remote set-url で上書き or rm してから add
fatal: 'origin' does not appear to be a git repositoryリモート未登録git remote -v で確認、未登録なら add
remote: Permission to ... deniedSSH 鍵 / PAT 認証エラーssh -T git@github.com で鍵確認、PAT 期限確認
The requested URL returned error: 403HTTPS で credential helper が古い PAT を握りっぱなしgit credential-manager erase / OS のキーチェーン削除
push したのに反映されていない別ブランチや別リモートに飛んだgit remote -vgit branch -vv で確認

FAQ

Q: origin という名前を変えたい
A: git remote rename origin github で OK。以後は git push github main のように使えます。

Q: 移管したけど CI が古い URL を見続けている
A: ローカル / CI 両方で git remote set-url を実行する必要があります。CI 側はリポジトリ設定の Webhook / 連携 URL も新リポジトリに差し替えてください。

Q: git remote updategit fetch --all の違い
A: ほぼ同じです。git remote updateすべてのリモートfetch します。git fetch --all も同じ動作で、現代は後者が一般的です。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 用語一覧
  2. エラー一覧
  3. git本体のインストール(Linux)
  4. Linuxサーバーへのgit導入とクライアントのセットアップ
  5. リモートリポジトリをローカルリポジトリとしてクローンする方法
  6. リモートとローカルのリポジトリを同期(pull)する方法
  7. 設定の確認
  8. gitユーザー名とemailの設定
  9. リモートリポジトリの作成
  10. ローカルリポジトリの作成
  11. 新規ファイル/ディレクトリをインデックスに登録
  12. インデックスの登録状態を確認
  13. ローカルリポジトリの変更をコミット
  14. コミット履歴の確認
  15. クライアントからリモートリポジトリの接続設定、確認、削除
  16. リポジトリへのプッシュ
  17. リモートリポジトリからクライアントへのSSHクローン
  18. リモートとローカルの差分表示
  19. バージョンの確認
  20. プロキシの設定
  21. ローカルをリモートリポジトリの状態に戻す
  22. ブランチの作成, 一覧表示, 切り替え
  23. ブランチのマージと削除
  24. リベース
  25. .gitignoreの書き方
  26. .gitignoreの設定が反映されない場合
  27. 特定のファイルをgitの管理から外す方法
  28. 参照(ORIG_HEAD, HEAD, FETCH_HEAD)
  29. git rm [-r --cached] の取り消し
  30. 一部のディレクトリ/ファイルのみをリポジトリから復元する方法
  31. ローカルとリモートリポジトリの有無を同期
  32. pushの取消し方法
  33. マージツールの起動方法
  34. Gitで「MERGING」の状態

最近更新/作成されたページ