SVN の場合は、単一の中央集中型リポジトリを開発者間のコミュニケーションハブとして使用し、コラボレーションとは開発者の作業コピーと中央リポジトリ間で変更を受け渡しするプロセスを意味します。Git の分散コラボレーションモデルはこれとは異なり、開発者それぞれにリポジトリのコピーがあり、ローカルの履歴やブランチ構造を完全な形で保有しています。開発者は、他の開発者と個々の変更を共有する必要はなく、通常は一連のコミットをまとめて共有します。中央リポジトリを変更する場合、Git では作業コピー内の個々の変更項目を中央リポジトリにコミットするのではなく、ブランチ全体をリポジトリ間で共有します。

git remote コマンドは変更の同期の役割を果たす広範なシステムの一部分です。git remote コマンドで登録された記録は git fetchgit pushgit pull コマンドと併せて使用されます。これらのコマンドの各々に、同期するための役割があります。詳しくはそれぞれのリンク先をご参照ください。

git remote

git remote は、他のリポジトリとの接続の作成、内容確認、削除を行うコマンドです。リモート接続とは、他のリポジトリへのダイレクトリンクではなく、ブックマークのようなものです。他のリポジトリにリアルタイムアクセスを行うのではなく、非短縮 URL への参照として使用可能な短縮名称として機能します。

たとえば、次の図はローカルリポジトリと中央リポジトリとの間およびローカルリポジトリと他の開発者のリポジトリとの間の 2 つのリモート接続を示したものです。それらをフル URL を用いて参照するのではなく、他の Git コマンドに “origin” および “john” という名称のショートカットを引き渡すことが可能になります。

Using git remote to connect other repositories

git remote の使い方の概要

git remote コマンドは、基本的にリポジトリの ./.git/config ファイルに保存されたリモートエントリの一覧を管理するインターフェイスです。次に示すコマンドを使用して、リモート一覧の現在の状態を表示します。

git remote 構成の表示

git remote

他のリポジトリへのリモート接続の一覧を表示するコマンドです。

git remote -v

上のコマンドと同様ですが、ただし各接続の URL が表示されます。

git remote 構成の作成と変更

git remote コマンドはリポジトリの ./.git/config ファイルを変更するのに便利な「ヘルパー」メソッドです。下記のコマンドにより、他のリポジトリとの接続を管理できます。次に示すコマンドはリポジトリの /.git/config ファイルを変更します。テキストエディターで ./.git/config ファイルを直接編集しても、次に示すコマンドと同じ結果を得られます。

git remote add <name> <url>

リモートリポジトリに対する新規接続を作成するコマンドです。作成されると他の Git コマンドにおいて <url> の代わりに <name> を短縮ショートカットとして使用することができます。

git remote rm <name>

<name> という名称のリモートリポジトリへの接続を削除するコマンドです。

git remote rename <old-name> <new-name>

リモート接続を <old-name> から <new-name> にリネームするコマンドです。

git remote の解説

Git は、完全に分離された開発環境を各開発者に提供するように設計されています。これは、情報が自動的にリポジトリ間を行き来するわけではないことを意味します。つまり、開発者は手動で上流のコミットをローカルリポジトリにプルするか、ローカルのコミットを手動で中央リポジトリにプッシュバックする必要があります。git remote コマンドは、URL をこれらの「共有の」コマンドに渡すための非常に簡単な方法です。

origin リモート

git clone コマンドを使用してリポジトリをクローンすると、クローンされたリポジトリをポイントバックする origin という名称のリモート接続が自動的に作成されます。このコマンドは上流での変更をプルしたりローカルなコミットを公開したりする簡便な手段を提供するものであり、開発者にとっては中央リポジトリの作業コピーを作成する場合に有用なコマンドです。この機能により、Git ベースのほとんどのプロジェクトでは中央リポジトリの名称が origin になっています。

リポジトリ URL

Git ではリモートリポジトリを参照する多くの手段がサポートされています。すなわち、リモートリポジトリにアクセスする極めて簡便な手段として、HTTP プロトコルと SSL プロトコルが用意されています。HTTP はリポジトリに対して匿名のリードオンリーアクセスを行う簡便な方法です。次はその例です。

http://host/path/to/repo.git

ただし、通常は HTTP アドレスに対してプッシュを行うことはできません (他の開発者からローカルリポジトリに対して匿名のプッシュがあったとしても常に拒否するはずです)。リードライトアクセスを行う場合は SSH を使用しなければなりません:

ssh://user@host/path/to/repo.git

ホストマシンでは有効な SSH アカウントを必要としますが、それ以外に Git は SSH を介した認証済みアクセスをそのままでサポートします。Bitbucket.com のような最新のサードパーティ製ホスティングソリューションがこれらの URL を提供します。

git remote コマンド

git remote コマンドは追加された「サブコマンド」からなるその他の数多くの Git コマンドの 1 つです。下記はよく使用される git remote サブコマンド

の例です。
ADD <NAME> <URL>

リポジトリ url <url> で <name> という名前のリモートの ./.git/config に記録を追加します。

-f オプションを指定すると、リモート記録が作成された直後に、git fetch <name> を実行します。

--tags オプションを指定すると、即座にgit fetch <name> を実行し、リモートリポジトリからすべてのタグをインポートします。

RENAME <OLD> <NEW>

./.git/config を更新すると、記録名が <OLD> から <NEW> に変更されます。リモートのすべてのリモートトラッキングブランチと構成設定が更新されます。

REMOVE or RM <NAME>

./.git/config を変更し、<NAME> という名前のリモートを削除します。リモートのすべてのリモートトラッキングブランチと構成設定が削除されます。

GET-URL <NAME>

リモート記録の URL を出力します。

--push を指定すると、fetch URL ではなく push URL がクエリされます。

--all を指定すると、リモートのすべての URL が一覧表示されます。

SHOW <NAME>

リモート <NAME> についての概要情報を出力します。

PRUNE <NAME>

リモートリポジトリに存在しない <NAME> のすべてのローカルブランチを削除します。

--dry-run オプションを指定すると、prune とマークされたブランチを一覧表示しますが、実際には pruned は実行されません。

git remote の例

origin に加えて他の開発者のリポジトリへの接続を作成しておくと便利なケースがよくあります。たとえば、同僚の John が公開リポジトリを dev.example.com/john.git に保有している場合、次のようにして接続を新たに作成します。

git remote add john http://dev.example.com/john.git

個々の開発者のリポジトリに対してこのようなアクセスをすることにより、中央リポジトリを介さずにコラボレーションが可能になります。この機能は特に、大規模プロジェクト内で作業する小規模チームの場合に有用です。

リモートの表示

既定では、git remote コマンドは他のリポジトリに以前に保存されたリモート接続を一覧表示します。これにより、リモートリポジトリの「ブックマーク」名の名前を一覧表示する 1 行の出力を生成します。

$ git remote
origin
upstream
other_users_repo

git remote コマンドを起動して-v オプションを指定すると、ブックマークされたリポジトリ名の一覧に加え、対応するリポジトリの URL を印刷します。-v オプションは、「verbose (詳細) 」を意味します。以下は詳細な git remote 出力の出力例です。

git remote -v
origin  git@bitbucket.com:origin_user/reponame.git (fetch)
origin  git@bitbucket.com:origin_user/reponame.git (push)
upstream    https://bitbucket.com/upstream_user/reponame.git (fetch)
upstream    https://bitbucket.com/upstream_user/reponame.git (push)
other_users_repo    https://bitbucket.com/other_users_repo/reponame (fetch)
other_users_repo    https://bitbucket.com/other_users_repo/reponame (push)

リモートリポジトリの追加

git remote add コマンドはリモートリポジトリに新しい接続記録を作成します。リモートを追加した後、他の Git コマンドの <url> の便利なショートカットとして、<name> を使用できます。承認された URL 構文の詳細については下記の「リポジトリ URL 」セクションをご覧ください。このコマンドはリポジトリの ./.git/config 内に新しい記録を作成します。この構成ファイルの更新の例を次に示します。

$ git remote add fake_test https://bitbucket.com/upstream_user/reponame.git; [remote "remote_test"] 
   url = https://bitbucket.com/upstream_user/reponame.git 
   fetch = +refs/heads/*:refs/remotes/remote_test/*

リモートの検査

show サブコマンドを git remote に追加すると、リモートの構成の詳細な出力を得ることができます。この出力にはリモートに関連するブランチの一覧と、フェッチとプッシュのために接続されたエンドポイントも含みます。

git remote show upstream
* remote upstream
   Fetch URL: https://bitbucket.com/upstream_user/reponame.git
   Push URL: https://bitbucket.com/upstream_user/reponame.git
   HEAD branch: master
   Remote branches:
      master tracked
      simd-deprecated tracked
      tutorial tracked
   Local ref configured for 'git push':
      master pushes to master (fast-forwardable)

Git リモートからのフェッチとプル

git remote コマンドを使用して、リモート記録が構成されると、リモートの名前が引数として他の Git コマンドに渡され、リモートリポジトリと共有できます。git fetchgit pull の両方を使用し、リモートリポジトリからの読み込みを実行できます。両方のコマンドの操作は異なりますが、それぞれのリンクでさらに詳細を説明します。

Git リモートへのプッシュ

git push コマンドはリポジトリへの書き込みに使用されます。

git push <remote-name> <branch-name>

この例では、<branch-name> のローカルな状態を<remote-name> で指定しリモートリポジトリにアップロードします。

リモートの名前変更と削除

git remote rename <old-name> <new-name>

git remote rename のコマンドは読んで字のとおりです。実行すると、このコマンドはリモート接続の名前を <old-name> から <new-name> に変更します。さらにこのコマンドは ./.git/config の内容を変更し、そこでリモートの記録名も変更します。

git remote rm <name>

git remote rm コマンドは <name> パラメーターで指定されたリモートリポジトリの接続を削除します。説明のために、最後の例から、リモートの追加を「やり直し」ます。git remote rm remote_test を実行し、./.git/config の内容を確認すると、[remote "remote_test"] の記録はもうそこにないことがわかります。