git remote まわりの操作は、GitHubへの移行、組織名変更、マージ済みブランチの掃除など、チーム開発で定期的に必要になります。とはいえ remove と rm のどちらが正しいか、リモート自体の削除とリモート上のブランチ削除はどう違うか、といった地味なところで手が止まることもあります。
この記事は git remote のサブコマンドとリモートブランチ操作を一通りまとめた早見表的な記事です。裏で書き換えている .git/config の中身や、よくあるエラーの対処にも触れます。
git remoteとは
git remote が管理しているのは、ローカルリポジトリが覚えている「リモートリポジトリへのブックマーク」です。GitHub上のリポジトリそのものではなく、URLに付けた短い別名の一覧だと思えば概ね合っています。git clone すると自動で作られる origin も、単にクローン元URLに付いた別名です。
この情報は .git/config に書かれています。
[remote "origin"]
url = git@github.com:example/repo.git
fetch = +refs/heads/*:refs/remotes/origin/*以降の各コマンドは、このセクションを書き換えるためのインターフェースに過ぎません。コマンドでうまくいかないとき、.git/config を直接開いて直せるのはこのためです。
origin と upstream は慣習で、それぞれ「自分のクローン元」「フォーク元の本家」を指します。強制ではないので、好きな名前で構いません。
現状を確認する|git remote -v
# 登録されているリモート名だけ
$ git remote
origin
upstream
# URL付きで確認(実務でよく使う)
$ git remote -v
origin git@github.com:myorg/myrepo.git (fetch)
origin git@github.com:myorg/myrepo.git (push)
upstream git@github.com:original/myrepo.git (fetch)
upstream git@github.com:original/myrepo.git (push)(fetch) と (push) が別行で出るのは、push先だけ別URLに切り替えられる仕様があるためで、通常は同一になります。
詳細を見たいときは show を使います。
$ git remote show origin
* remote origin
Fetch URL: git@github.com:myorg/myrepo.git
Push URL: git@github.com:myorg/myrepo.git
HEAD branch: main
Remote branches:
main tracked
feature/new-auth tracked
stale-branch stale (use 'git remote prune' to remove)stale は、リモート側で既に消されているのにローカルの追跡ブランチだけ残っている状態です。掃除方法は後段の git fetch --prune で扱います。
リモートを追加する|git remote add
# 構文
git remote add <リモート名> <URL>
# フォーク運用で本家を upstream として追加
git remote add upstream git@github.com:original/myrepo.gitHTTPSとSSHは組織のポリシーで選びます。PATの期限管理を避けたい個人環境ではSSHのほうが楽です。
# HTTPS
git remote add origin https://github.com/myorg/myrepo.git
# SSH
git remote add origin git@github.com:myorg/myrepo.git追加後は git remote -v で期待通りのURLかを確認します。typoで別の組織を指していた、というのは時々起きるミスです。
リモートを削除する|git remote remove / rm
この操作で消えるのはローカル側のブックマークだけです。GitHub上のリポジトリは消えません。リモート側のリポジトリを削除したい場合は各サービスの管理画面から行います(手順は後述)。
# 推奨
git remote remove origin
# 古い書き方(同じ動作)
git remote rm originremove と rm は完全に同じです。Git 1.8で remove がエイリアスとして追加されたという経緯の違いで、どちらを書いても問題ありません。
削除すると .git/config の [remote "origin"] セクションが丸ごと消えます。これに連動して refs/remotes/origin/* のリモート追跡ブランチも削除されます。ローカルの作業ブランチやコミット自体はそのまま残ります。
よくある用途は、フォーク元から clone した直後に origin を自分のフォークへ差し替える場面です。
# 旧originを削除
git remote remove origin
# 新しいoriginを設定
git remote add origin git@github.com:your-account/your-repo.git
# 確認
git remote -vURLだけ差し替えたいなら、次の set-url のほうが手数が少なくて済みます。
.git/config を直接編集する
スクリプトから一括で書き換えたいときや、何らかの理由でコマンドが効かないときは、.git/config を直接開くのが最短です。
git config --edit[remote "..."] と、そのインデント行をまとめて消せば同じ状態になります。
リモートリポジトリ自体を削除したい場合
GitHubやGitLab上のリポジトリそのものを削除したい場合は、Gitコマンドではなく各プラットフォームのWeb UIで行います。
- GitHub: Settings → Danger Zone → Delete this repository
- GitLab: Settings → General → Advanced → Delete project
リポジトリ削除は不可逆で、Issue・Pull Request・Wikiなども全て失われます。実行前にアーカイブかバックアップを取ってください。
リモートURLを変更する|git remote set-url
登録名は維持したままURLだけ差し替えます。組織名変更、HTTPS↔SSH切り替え、ホスト移行などで使います。
# HTTPS → SSH
git remote set-url origin git@github.com:myorg/myrepo.git
# 組織名変更に追従
git remote set-url origin git@github.com:new-org/new-repo.gitremove → add でも同じ結果になりますが、set-url なら追跡ブランチ情報を保持したまま差し替えられます。
push先だけ別URLにする
ミラーリング運用で「fetchは本家、pushは自社フォーク」のような構成にしたいときは --push を付けます。
git remote set-url --push origin git@github.com:myorg/fork.gitこの状態で git remote -v を見ると、(fetch) と (push) のURLが別々になっています。
リモート名を変更する|git remote rename
git remote rename origin old-originorigin から逸脱するとCIスクリプトやドキュメントの前提と噛み合わなくなることがあるので、必要最小限に留めるのが無難です。複数リモートを抱えた移行期に一時的にリネームする、くらいが現実的な用途です。
リモートブランチを削除する|git push origin --delete
ここからは話が変わって、リモートリポジトリの中にあるブランチそのものを消す操作です。前項までの「リモート登録(ブックマーク)を消す」とは別の操作なので注意してください。
# 推奨
git push origin --delete feature/old-branch
# 旧形式(コロン記法、今でも有効)
git push origin :feature/old-branchコロン記法は「空のものを feature/old-branch に push する=削除」という意味ですが、直感的ではないので、新規プロジェクトでは --delete のほうが読みやすいです。
削除前にマージ済みか確認する
未マージのブランチを消すと、GitHub/GitLab側のreflog保持期間を過ぎた時点で復旧不可能になります。削除前には --merged / --no-merged で状態を確認します。
# mainにマージ済みのリモートブランチ一覧
git branch -r --merged origin/main
# mainにマージされていないリモートブランチ一覧
git branch -r --no-merged origin/mainローカルブランチを削除する
リモートブランチを削除してもローカルの作業ブランチは残ります。不要なら別途削除します。
# マージ済みなら削除
git branch -d feature/old-branch
# 未マージで強制削除
git branch -D feature/old-branch-d(小文字)はマージ済みのみ削除可能で、未マージブランチを指定するとエラーになります。-D(大文字)は未マージでも削除するため、内容を確認してから使います。
マージ済みローカルブランチを一括削除する
溜まったマージ済みブランチをまとめて消したいときのワンライナーです。
git branch --merged main | grep -v "main" | xargs git branch -d頻繁に使うならエイリアスに登録しておくと手数が減ります。
git config --global alias.cleanup '!git branch --merged main | grep -v "main" | xargs git branch -d'
# 以降は
git cleanupリモートとローカル両方を削除する手順
実務ではリモートとローカルの両方を同時に消すケースが大半です。次の3ステップをセットで実行します。
# 1. リモートブランチを削除
git push origin --delete feature/old-branch
# 2. ローカルブランチを削除
git branch -d feature/old-branch
# 3. リモート追跡ブランチの参照を整理
git fetch --pruneGitHubのPull Request設定で「Automatically delete head branches」を有効にしておけば、マージ時に1のステップが自動化されます。
古いリモート追跡ブランチを掃除する|git fetch --prune
チーム開発では、他のメンバーがリモートブランチを削除しても、自分のローカルには refs/remotes/origin/* の参照が残り続けます。
# stale なリモート追跡ブランチを削除
git fetch --prune
# 短縮形
git fetch -p
# 事前に何が消えるか確認
git remote prune origin --dry-runfetchのたびに自動で掃除したい場合は、設定で常時有効にできます。
git config --global fetch.prune trueこれを入れておくと git fetch するだけで掃除されます。長く使うリポジトリほど効いてきます。
追跡関係だけを解除する
ブランチ単位で「このローカルブランチが origin/xxx を追跡している」関係だけを切りたいときは、git remote remove ではなく git branch --unset-upstream を使います。
# 現在のブランチの追跡関係を解除
git branch --unset-upstream
# 特定ブランチの追跡関係を解除
git branch --unset-upstream feature/experimental逆に張り直すときはこちら。
git branch -u origin/mainこの操作で書き換わっているのは .git/config の [branch "..."] セクションです。
[branch "main"]
remote = origin
merge = refs/heads/mainここが消えたり壊れたりしている状態で git push すると no upstream branch エラーが出ます。
削除したブランチを復元する
誤って削除した場合でも、多くのケースで復元は可能です。
ローカルブランチの復元
git reflog で削除直前のコミットハッシュを特定し、そこからブランチを作り直します。
# reflogで削除されたブランチのコミットを探す
git reflog
# 見つかったコミットハッシュからブランチを再作成
git checkout -b feature/old-branch abc1234reflogはデフォルトで90日間保持されるため、よほど古くなければ遡れます。
リモートブランチの復元
削除直後なら、チームメンバーのローカルにブランチが残っている可能性があります。誰かのローカルから push してもらうのが一番早いです。
誰のローカルにもない場合は、自分のreflogから復元して push し直します。
# reflogからコミットハッシュを特定
git reflog
# ローカルブランチを再作成
git checkout -b feature/old-branch abc1234
# リモートに再push
git push origin feature/old-branchよくあるエラー
fatal: remote origin already exists
同名のリモートが登録済みの状態で git remote add origin ... を実行したときに出ます。
# URLを差し替えたいだけなら set-url のほうが後腐れない
git remote set-url origin <新しいURL>
# 登録ごと置き換えたいなら remove → add
git remote remove origin
git remote add origin <新しいURL>fatal: No such remote 'origin'
登録されていない名前を指定したときに出ます。git remote -v で登録状況とタイポを確認します。
error: failed to push some refs
リモートに自分が知らないコミットが既にある状態で、そのまま上書きできないためpushが拒否されます。別のメンバーが先にpushしていた、というのが典型的な原因です。
# リモートの変更を取り込んでから push し直す
git pull --rebase
git pushset-url で向き先を書き換えた直後は、誤って別リポジトリに push しようとしている可能性もあります。git remote -v で push先を併せて確認してください。
認証エラー(SSH鍵 / PAT)
HTTPSならPATの期限切れ、SSHなら鍵が ~/.ssh/ に置かれていない、というのが典型です。
# SSH疎通確認
ssh -T git@github.comHTTPSの場合はブラウザで対象サービスに入り直してPATを再発行します。
チーム開発での運用メモ
- マージ後の自動削除を有効化: GitHubの「Automatically delete head branches」設定で、マージ時にリモートブランチを自動削除
- 命名規則の統一:
feature/、bugfix/、hotfix/などのプレフィックスを揃えると一括削除の対象判定が楽になる - 定期的な棚卸し: 月次や隔週で
git cleanupエイリアスを回す - 保護ブランチ: main/develop には Branch Protection Rules を設定し誤削除を防ぐ
fetch.prune = trueを全員に:.gitconfigに入れておくと stale なリモート追跡ブランチが溜まらない
コマンド早見表
| やりたいこと | コマンド |
|---|---|
| リモート一覧 | git remote -v |
| 詳細を見る | git remote show origin |
| リモート追加 | git remote add <name> <url> |
| リモート削除 | git remote remove <name> |
| URL変更 | git remote set-url <name> <url> |
| push先だけ変更 | git remote set-url --push <name> <url> |
| リモート名変更 | git remote rename <old> <new> |
| リモートブランチ削除 | git push origin --delete <branch> |
| ローカルブランチ削除 | git branch -d <branch> / -D |
| 古い追跡ブランチ掃除 | git fetch --prune |
| fetch時に自動掃除 | git config --global fetch.prune true |
| 追跡関係を解除 | git branch --unset-upstream |
| 追跡関係を張る | git branch -u origin/<branch> |
| 削除ブランチ復元 | git reflog → git checkout -b <branch> <SHA> |
git remote 周りは結局 .git/config の [remote "..."] を書き換えているだけなので、コマンドを忘れてもファイルを直接開けば対処できます。
リモートブランチをローカルに取得して作業する手順は Gitでリモートブランチをチェックアウトする方法、リポジトリからファイルを削除する手順は Gitでファイルを削除する方法 をあわせてご覧ください。
aduce株式会社では、Git運用の標準化を含む開発プロセスの最適化をIT顧問サービスとしてご支援しています。チームのGitワークフローを改善したいとお考えでしたら、ぜひお問い合わせからご相談ください。
