リモート Git リポジトリ | git fetch

git fetch コマンド

git fetch は、リモートリポジトリからローカルリポジトリへブランチを取得するコマンドである。取得したブランチは、これまで学んできた通常のローカルブランチではなく、リモート追跡ブランチとして保存される。この機能により、ローカルリポジトリへ統合する前に変更内容を確認できる。

使い方

git fetch <remote>

指定したリポジトリからすべてのブランチを取得するコマンドである。関連するすべてのコミットとファイルもそのリポジトリからダウンロードされる。

git fetch <remote> <branch>

上のコマンドと同じ機能を持つが、取得対象は指定したブランチだけである。

補足説明

fetch は、他の開発者の作業内容を確認したい場合に行う操作である。取得したブランチはリモート追跡ブランチとして表現されるため、ローカルの開発作業にはまったく影響しない。取得したブランチをローカルリポジトリへ統合する前に内容を確認できるため、fetch は安全な操作である。このコマンドは、中央リポジトリの進行状況を確認できるという意味では SVN の svn update に似ているが、実際にはブランチをローカルブランチへ統合しない。

リモート追跡ブランチ

リモート追跡ブランチはローカルブランチに似ているが、他の開発者のリポジトリにあるブランチを指している。ローカルブランチと同じようにリモート追跡ブランチをチェックアウトできるが、その場合は過去のコミットをチェックアウトした場合と同様に detached HEAD 状態になる。つまり、リモート追跡ブランチは読み取り専用ブランチだと考えられる。

リモート追跡ブランチの一覧を表示するには、-r フラグを指定して git branch を実行する。リモート追跡ブランチ名の先頭には、そのブランチがあるリモート接続の名前が付くため、ローカルブランチと混同しない。

git branch -r
# origin/master
# origin/develop
# origin/some-feature

ここでも通常の git checkoutgit log を使ってブランチを確認できる。リモート追跡ブランチに含まれる変更が受け入れ可能であれば、通常の git merge でローカルリポジトリへマージできる。したがって SVN とは異なり、ローカルリポジトリをリモートリポジトリと同期する作業は、実際には fetch と merge の 2 段階である。git pull はこの 2 段階の作業を簡単にするショートカットである。

使用例

この例では、ローカルリポジトリを中央リポジトリの master ブランチと同期するときの一般的なワークフローを示す。

git fetch origin

このコマンドを実行すると、ダウンロードされたブランチが表示される。

a1e8fb5..45e66a4 master -> origin/master
a1e8fb5..9e8ab1c develop -> origin/develop
* [new branch] some-feature -> origin/some-feature

チュートリアル図のように、これらのリモート追跡ブランチにあるコミットはローカルブランチのコミットとは異なる形で表示される。git fetch を実行すると、リモートリポジトリのすべてのブランチにアクセスできる。

Git チュートリアル: git fetch

中央リポジトリの master に追加されたコミットを確認するには、次のように master ブランチの範囲を対象に git log を実行する。

git log --oneline master..origin/master

次のコマンドは変更を受け入れ、それらをローカルの master ブランチへマージする。

git checkout master
git log origin/master

そして origin/master をマージする。

git merge origin/master

これで origin/mastermaster の両ブランチが同じコミットを指すようになり、中央リポジトリとの同期が完了する。