Close

git fetch

git fetch コマンドは、リモート・リポジトリからローカル・リポジトリにコミット、ファイル、参照をダウンロードします。フェッチとは、他の開発者の作業内容を確認する場合に行う操作です。このコマンドは、中央リポジトリの進捗状況を確認できるという意味では svn update コマンドと似ていますが、このコマンドでは変更はリポジトリに統合されません。Git によってフェッチされたコンテンツは既存のローカル・コンテンツから分離されるため、ローカルな開発作業には全く影響を与えません。フェッチされたコンテンツは、git checkout コマンドを使って、明示的に確認する必要があります。フェッチしたブランチをローカル・リポジトリに統合する前にその内容を確認することが可能であり、このためフェッチは安全な操作と言えます。

コンテンツをリモート リポジトリからダウンロードする際は、git pull コマンドおよび git fetch コマンドを利用してタスクを実行できます。git fetch は、2 つのコマンドの「安全な」バージョンと考えられます。リモート コンテンツがダウンロードされますが、ローカル リポジトリの作業状態は更新されず、現在の作業がそのまま残ります。これに対し、git pull は、より積極的な選択肢です。リモート コンテンツがアクティブなローカル ブランチにダウンロードされ、すぐに git merge が実行されて、新しいリモート コンテンツのマージ コミットが作成されます。現在の作業に保留中の変更がある場合は、これにより競合が起こるため、マージ競合を解決するフローが開始されます。


リモートブランチでの git fetch の具体的な動作


git fetch の具体的な動作についての理解を深めるため、Git がコミットを整理して保存する仕組みについて見ていきます。内部を見ると、Git ではリポジトリの ./.git/objects ディレクトリにリモートとローカルのコミットがすべて保存されます。Git ではブランチの参照を使用することで、リモートとローカルのブランチのコミットがはっきりと区別されます。ローカル・ブランチの参照は ./.git/refs/heads/ に保存されます。git branch コマンドを実行すると、ローカル・ブランチの参照のリストが出力されます。以下は、デモ用のブランチ名を含む git branch 出力の例です。

git branch
main
feature1
debug2

/.git/refs/heads/ ディレクトリの中を調べると、同様の出力を確認できます。

ls ./.git/refs/heads/
main
feature1
debug2
コンソール・ウィンドウ
関連資料

高度な Git ログ

Bitbucket ロゴ
ソリューションを見る

Bitbucket Cloud での Git の使用方法についてのチュートリアルです。

リモート ブランチはローカル ブランチとよく似ていますが、リモート ブランチでは所有者の異なるリポジトリからのコミットにマッピングされる点で異なります。リモート ブランチとローカル ブランチを混同しないように、リモート ブランチには所属するリモートのプレフィックスが付いています。ローカル ブランチと同じように、Git ではリモート ブランチの参照も使用します。リモート ブランチの参照は ./.git/refs/remotes/ ディレクトリにあります。次のコード スニペットでは、わかりやすく「remote-repo」と名付けられたリモート リポジトリをフェッチした後に表示されるブランチの例を示しています。

git branch -r
# origin/main
# origin/feature1
# origin/debug2
# remote-repo/main
# remote-repo/other-feature

この出力には、先ほど見たローカル ブランチが表示されていますが、今度は origin/ というプレフィックスが付いています。また今度は、リモート ブランチに remote-repo というプレフィックスが付いているのがわかります。リモート ブランチはローカル ブランチと同じ要領でチェックアウトできますが、その結果、detached HEAD 状態になります (古いコミットのチェックアウトと同様)。これらは、読み取り専用のブランチと考えられます。リモート ブランチを表示するには、-r フラグを git branch コマンドに渡します。

通常の git checkout コマンドや git log コマンドを使用して、リモート ブランチの内容を確認できます。リモート ブランチに含まれる変更を承認する場合、通常の git merge コマンドを使用してそれをローカル ブランチにマージできます。したがって、SVN とは異なり、ローカル リポジトリをリモート リポジトリと同期する操作は、実際にはフェッチとマージの 2 段階の操作です。git pull コマンドはこの 2 段階の操作を簡便化します。

Get fetch コマンドとオプション


git fetch <remote>

リポジトリからすべてのブランチをフェッチするコマンドです。このコマンドを実行すると、付随するすべてのコミットおよびファイルもそのリポジトリからダウンロードされます。

git fetch <remote> <branch>

上のコマンドと同様の機能を有するコマンドですが、ただしフェッチする対象は指定したブランチのみです。

git fetch --all

上は、登録されたリモートとブランチをすべてフェッチする強力な操作です。

git fetch --dry-run

--dry-run オプションを指定すると、このコマンドの実行デモが実行されます。フェッチ中に起こるアクションの例を出力しますが、実際には適用しません。

git fetch の例


リモートブランチの git fetch

次の例では、リモート ブランチをフェッチしてローカルの作業状態をリモート コンテンツで更新する方法を示します。この例では、原典となる中央リポジトリがあり、git clone コマンドを使用してそこからローカル リポジトリのクローンが作成されているものとします。また feature_branch を含む「coworkers_repo」という別のリモート リポジトリがあると仮定し、その設定とフェッチを行います。これらの前提に基づき、引き続きこの例を見ていきましょう。

まず、git remote コマンドを使用して、リモート・リポジトリを設定する必要があります。

git remote add coworkers_repo git@bitbucket.org:coworker/coworkers_repo.git

ここではリポジトリの URL を使用して coworker のリポジトリへの参照を作成しました。今度はこのリモートの名前を git fetch に渡してコンテンツをダウンロードします。

git fetch coworkers_repo coworkers/feature_branch
fetching coworkers/feature_branch

ローカルに coworkers/feature_branch のコンテンツを用意したところで、今度はこのコンテンツをローカルの作業コピーに統合する必要があります。このプロセスを始めるにあたり、git checkout コマンドを使用して、新しくダウンロードしたリモート・ブランチを確認します。

git checkout coworkers/feature_branch
Note: checking out coworkers/feature_branch'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

git checkout -b <new-branch-name>

このチェックアウト操作の出力を見ると、detached HEAD 状態になっています。これは想定どおりであり、HEAD 参照がローカルの履歴と適合しない参照をポイントしていることがわかります。coworkers/feature_branch の参照で HEAD がポイントされているため、この参照から新しいローカル ブランチを作成できます。「detached HEAD」の出力を見ると、git checkout コマンドを使用してこの操作を行う具体的な方法がわかります。

git checkout -b local_feature_branch

ここでは「local_feature_branch」という新しいローカル ブランチを作成しました。これで、最新のリモート コンテンツをポイントするよう HEAD が更新されるため、このポイントから開発を続行できます。

git fetch と origin の同期

次の例では、ローカル リポジトリを中央リポジトリの main ブランチと同期する際の典型的なワークフローを説明します。

git fetch origin

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

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

下図では、これらの新しいリモート ブランチに含まれるコミットは円ではなく四角形で表示されています。これでわかるとおり、git fetch コマンドを実行すると、別のリポジトリのブランチ全体にアクセスできます。

図:origin ブランチから main ブランチまで

上流の main に加えられたコミットを確認するには、次のように origin/main をフィルターとして使用して git log コマンドを実行できます。

git log --oneline main..origin/main

変更を承認してローカルの main ブランチにマージするには、次のコマンドを使用します。

git checkout main
git log origin/main

次に git merge origin/main を使用できます。

git merge origin/main

origin/main ブランチと main ブランチは同じコミットを示して、上流の開発と同期します。

git fetch の概要


ここまでを振り返りましょう。git fetch は、リモート・リポジトリからコンテンツをダウンロードするために使用する主要コマンドです。ローカル・リポジトリをリモートの状態にアップデートするときは、git fetch を、git remotegit branchgit checkoutgit reset と組み合わせて使用します。git fetch コマンドは、連携して進行する Git のワークフローに欠かせない重要な要素です。git fetchgit pull と動作が似ていますが、git fetch の方が安全で、操作に支障をきたしません。


この記事を共有する
次のトピック

おすすめコンテンツ

次のリソースをブックマークして、DevOps チームのタイプに関する詳細や、アトラシアンの DevOps についての継続的な更新をご覧ください。

一面のツールを使ってコラボレーションしている人たち

Bitbucket ブログ

DevOps のイラスト

DevOps ラーニング パス

Demo Den アトラシアン・エキスパートによる機能デモ

Bitbucket Cloud が、Atlassian Open DevOps とどのように連携するか

DevOps ニュースレター購読

Thank you for signing up