章 ▾ 第2版

2.5 Gitの基本 - リモートの利用

リモートの利用

どのGitプロジェクトでも共同作業を行うためには、リモートリポジトリの管理方法を知る必要があります。リモートリポジトリとは、インターネット上またはネットワーク上のどこかにホストされているプロジェクトのバージョンです。これらを複数持つことができ、それぞれが通常、読み取り専用であるか、読み書き可能であるかのいずれかです。他の人と共同作業を行うには、これらのリモートリポジトリを管理し、作業を共有する必要があるときにデータをプッシュしたりプルしたりすることが含まれます。リモートリポジトリの管理には、リモートリポジトリの追加方法、無効になったリモートの削除、さまざまなリモートブランチの管理とそれらを追跡対象とするかどうかの定義などが含まれます。このセクションでは、これらのリモート管理スキルの一部を説明します。

リモートリポジトリはローカルマシン上にある場合があります。

実際には同じホスト上にある「リモート」リポジトリを扱っている可能性は十分にあります。「リモート」という言葉は、必ずしもリポジトリがネットワーク上やインターネット上の別の場所にあることを意味するわけではなく、単に別の場所にあることを意味します。このようなリモートリポジトリを扱う場合でも、他のリモートと同様に、標準的なプッシュ、プル、フェッチの操作がすべて含まれます。

リモートの表示

設定されているリモートサーバーを確認するには、git remoteコマンドを実行します。このコマンドは、指定した各リモートハンドルのショートネームを一覧表示します。リポジトリをクローンした場合は、少なくともoriginが表示されるはずです — これは、Gitがクローン元のサーバーに与えるデフォルトの名前です。

$ git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin

また、-vオプションを指定すると、そのリモートへの読み書き時に使用されるショートネームに対してGitが保存しているURLが表示されます。

$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)

複数のリモートがある場合、このコマンドはそれらすべてを一覧表示します。たとえば、複数の共同作業者と連携するための複数のリモートを持つリポジトリは、次のように表示されることがあります。

$ cd grit
$ git remote -v
bakkdoor  https://github.com/bakkdoor/grit (fetch)
bakkdoor  https://github.com/bakkdoor/grit (push)
cho45     https://github.com/cho45/grit (fetch)
cho45     https://github.com/cho45/grit (push)
defunkt   https://github.com/defunkt/grit (fetch)
defunkt   https://github.com/defunkt/grit (push)
koke      git://github.com/koke/grit.git (fetch)
koke      git://github.com/koke/grit.git (push)
origin    git@github.com:mojombo/grit.git (fetch)
origin    git@github.com:mojombo/grit.git (push)

これは、これらのユーザーの誰からでも簡単に貢献をプルできることを意味します。さらに、これらのうち1つ以上にプッシュする権限を持っている可能性もありますが、ここではそれを判別できません。

これらのリモートがさまざまなプロトコルを使用していることに注意してください。これについては、サーバーへのGitの導入で詳しく説明します。

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

git cloneコマンドがどのようにして暗黙的にoriginリモートを追加するかについて言及し、いくつかのデモンストレーションを行ってきました。ここでは、新しいリモートを明示的に追加する方法を説明します。新しいリモートGitリポジトリを簡単に参照できるショートネームとして追加するには、git remote add <shortname> <url>を実行します。

$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)
pb	https://github.com/paulboone/ticgit (fetch)
pb	https://github.com/paulboone/ticgit (push)

これで、コマンドラインでURL全体ではなくpbという文字列を使用できます。たとえば、Paulが持っているがまだ自分のリポジトリにないすべての情報をフェッチしたい場合は、git fetch pbを実行できます。

$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit
 * [new branch]      master     -> pb/master
 * [new branch]      ticgit     -> pb/ticgit

Paulのmasterブランチは、ローカルでpb/masterとしてアクセスできるようになりました。これを自分のブランチの1つにマージすることも、検査したい場合はその時点でローカルブランチをチェックアウトすることもできます。ブランチとは何か、そしてそれらをどのように使用するかについては、Gitブランチでさらに詳しく説明します。

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

ご覧の通り、リモートプロジェクトからデータを取得するには、以下を実行します。

$ git fetch <remote>

このコマンドは、そのリモートプロジェクトにアクセスし、まだ持っていないそのリモートプロジェクトのすべてのデータをダウンロードします。これを行った後、そのリモートのすべてのブランチへの参照を持つことになり、いつでもマージしたり検査したりできます。

リポジトリをクローンすると、コマンドはそのリモートリポジトリを「origin」という名前で自動的に追加します。したがって、git fetch originは、クローンしてから(または最後にフェッチしてから)そのサーバーにプッシュされた新しい作業をすべてフェッチします。git fetchコマンドはデータをローカルリポジトリにダウンロードするだけであり、自動的に既存の作業とマージしたり、現在作業中の内容を変更したりすることはない点に注意することが重要です。準備ができたら、手動で自分の作業にマージする必要があります。

現在のブランチがリモートブランチを追跡するように設定されている場合(詳細については次のセクションとGitブランチを参照)、git pullコマンドを使用して、そのリモートブランチを自動的にフェッチし、現在のブランチにマージできます。これは、より簡単で快適なワークフローとなるかもしれません。デフォルトでは、git cloneコマンドは、クローン元のサーバー上のリモートmasterブランチ(またはデフォルトブランチの名前)を追跡するように、ローカルのmasterブランチを自動的に設定します。git pullを実行すると、通常、最初にクローンしたサーバーからデータをフェッチし、現在作業中のコードに自動的にマージしようとします。

Gitバージョン2.27以降では、pull.rebase変数が設定されていない場合、git pullは警告を発します。この変数を設定するまで、Gitは警告を表示し続けます。

Gitのデフォルトの動作(可能であればfast-forward、そうでなければマージコミットを作成)を希望する場合: git config --global pull.rebase "false"

プル時にリベースを希望する場合: git config --global pull.rebase "true"

リモートへのプッシュ

プロジェクトを共有したい段階になったら、上流にプッシュする必要があります。これに関するコマンドはシンプルです: git push <remote> <branch>。自分のmasterブランチをoriginサーバーにプッシュしたい場合(繰り返しますが、クローンすると通常、これらの名前は両方とも自動的に設定されます)、このコマンドを実行して行ったコミットをサーバーにプッシュできます。

$ git push origin master

このコマンドは、書き込みアクセス権のあるサーバーからクローンした場合、かつその間に誰もプッシュしていない場合にのみ機能します。もしあなたが他の誰かと同時にクローンし、彼らが先に上流にプッシュし、その後にあなたが上流にプッシュしようとすると、あなたのプッシュは正しく拒否されます。プッシュを許可される前に、まず彼らの作業をフェッチして自分の作業に取り込む必要があります。リモートサーバーへのプッシュ方法の詳細については、Gitブランチを参照してください。

リモートの検査

特定のリモートに関する詳細情報を確認したい場合は、git remote show <remote>コマンドを使用できます。このコマンドをoriginのような特定のショートネームで実行すると、次のような情報が表示されます。

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

リモートリポジトリのURLと、追跡ブランチの情報が表示されます。このコマンドは、masterブランチにいてgit pullを実行すると、リモートのmasterブランチがフェッチされた後に自動的にローカルブランチにマージされることを親切に教えてくれます。また、プルダウンしたすべてのリモート参照も一覧表示されます。

これは、遭遇する可能性のある単純な例です。しかし、Gitをより頻繁に使用するようになると、git remote showからより多くの情報が表示されることがあります。

$ git remote show origin
* remote origin
  URL: https://github.com/my-org/complex-project
  Fetch URL: https://github.com/my-org/complex-project
  Push  URL: https://github.com/my-org/complex-project
  HEAD branch: master
  Remote branches:
    master                           tracked
    dev-branch                       tracked
    markdown-strip                   tracked
    issue-43                         new (next fetch will store in remotes/origin)
    issue-45                         new (next fetch will store in remotes/origin)
    refs/remotes/origin/issue-11     stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    dev-branch merges with remote dev-branch
    master     merges with remote master
  Local refs configured for 'git push':
    dev-branch                     pushes to dev-branch                     (up to date)
    markdown-strip                 pushes to markdown-strip                 (up to date)
    master                         pushes to master                         (up to date)

このコマンドは、特定のブランチでgit pushを実行したときに、どのブランチに自動的にプッシュされるかを示します。また、サーバー上にまだ持っていないリモートブランチ、サーバーから削除されたリモートブランチ、およびgit pullを実行したときにリモート追跡ブランチと自動的にマージできる複数のローカルブランチも表示されます。

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

git remote renameを実行すると、リモートのショートネームを変更できます。たとえば、pbpaulに名前変更したい場合は、git remote renameで変更できます。

$ git remote rename pb paul
$ git remote
origin
paul

これにより、すべてのリモート追跡ブランチ名も変更されることに注意してください。pb/masterとして参照されていたものが、今度はpaul/masterになります。

何らかの理由で — サーバーを移動した、特定のミラーを使用しなくなった、あるいは貢献者がもう貢献していないなど — リモートを削除したい場合は、git remote removeまたはgit remote rmのいずれかを使用できます。

$ git remote remove paul
$ git remote
origin

この方法でリモートへの参照を削除すると、そのリモートに関連付けられているすべてのリモート追跡ブランチと設定も削除されます。

scroll-to-top