エラーの内容
git remote add origin <url> を実行すると、Gitが次のエラーで処理を止めます:
fatal: remote origin already exists.
このエラーの多くは、既存のリポジトリを新しいホストに向け直そうとしたときに発生します。たとえば、GitHubからGitLabへの移行、他人のプロジェクトのフォーク、またはリポジトリをクローンして自分のアカウントに接続し直そうとした場合などです。
なぜこのエラーが起きるのか
Gitはリモート情報を .git/config に保存します。origin という名前のリモートが既に登録されている場合(以前の git remote add や git clone によって自動的に作成された場合)、Gitは同じ名前のリモートを新たに作成することを拒否します。2回目の呼び出しを更新ではなく競合として扱うためです。
主な原因:
- リポジトリをクローンした後、別のURLで
originを再度追加しようとした。 - 同じリポジトリで
git remote add originを2回実行した。 - セットアップスクリプトが
originの存在を確認せずに追加しようとした。 - GitHubからGitLab(またはその逆)へ移行する際に
set-urlの代わりにaddを使用した。
修正方法1:リモートURLを更新する(最も簡単な方法)
origin は存在するが、URLが間違っている場合は add ではなく set-url を使います:
git remote set-url origin https://github.com/your-username/your-repo.git
SSHの場合:
git remote set-url origin git@github.com:your-username/your-repo.git
これだけでURLが置き換わります。ブランチ、コミット、ローカル設定はすべてそのまま保持されます。
修正方法2:削除してから再追加する
完全にリセットしたい場合は、リモートをいったん削除してから新しく追加します:
git remote remove origin
git remote add origin https://github.com/your-username/your-repo.git
**重要:**リモートを削除しても、ローカルのコミットやブランチには影響しません。.git/config のエントリが削除されるだけで、作業内容は安全に保持されます。
修正方法3:古いリモートをリネームして両方を保持する
移行中に古いリモートもしばらく必要な場合は、削除せずにリネームします:
git remote rename origin old-origin
git remote add origin https://github.com/your-username/new-repo.git
これで2つのリモートが作成されます。old-origin が以前のホストを指し、origin が新しいホストを指します。古いリモートからプルして、新しいリモートにプッシュできます。移行期間中に便利な方法です。
修正の確認
設定済みのすべてのリモートとURLを確認するには:
git remote -v
正常に更新された場合、次のように表示されます:
origin https://github.com/your-username/your-repo.git (fetch)
origin https://github.com/your-username/your-repo.git (push)
リネームした場合は、両方のリモートが表示されます:
old-origin https://gitlab.com/your-username/old-repo.git (fetch)
old-origin https://gitlab.com/your-username/old-repo.git (push)
origin https://github.com/your-username/new-repo.git (fetch)
origin https://github.com/your-username/new-repo.git (push)
次に、リモートに実際に接続できるか確認します:
git fetch origin
エラーが出なければ成功です。出力が空でも問題ありません。取得するものが何もないことを意味するだけです。
設定ファイルを直接確認する
ディスク上の実際の内容を確認したい場合は、.git/config を直接開きます:
cat .git/config
リモートエントリは通常このような形式になっています:
[remote "origin"]
url = https://github.com/your-username/your-repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
最終手段としてこのファイルを直接編集することもできますが、git remote コマンドを使う方が安全です。設定ファイルにタイポが1つあるだけで、リモート設定全体が壊れる可能性があります。
スクリプトでエラーを防ぐ
ブートストラップスクリプトを作成する場合は、git remote add を盲目的に呼び出す前にチェックを追加しましょう:
REMOTE_URL="https://github.com/your-username/your-repo.git"
if git remote get-url origin >/dev/null 2>&1; then
git remote set-url origin "$REMOTE_URL"
else
git remote add origin "$REMOTE_URL"
fi
origin が存在する場合はURLを更新し、存在しない場合は新規作成します。このパターンで両方のケースに対応でき、スクリプトを何度実行してもfatalエラーが発生しません。
クイックリファレンス
- URLを変更する:
git remote set-url origin <new-url> - 完全にリセットする:
git remote remove originを実行後、git remote add origin <url> - 古いリモートを残しつつ新しいものを追加:
git remote rename origin old-originを実行後、git remote add origin <url> - 現在の状態を確認する:
git remote -v

