Git
章 ▾ 第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 <短縮名> <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 のデフォルトの動作が必要な場合(可能な場合は高速転送、それ以外の場合はマージコミットを作成):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 を実行して、リモートの短縮名を変更できます。たとえば、pb の名前を paul に変更する場合は、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