検索
ニュース

「git pull」と「git fetch」の違いとは?それぞれのメリットを解説

TechTargetは「git pull」と「git fetch」の違いを解説する記事を公開した。主な違いは、git pullではリモートリポジトリの変更が作業ディレクトリに直接コピーされるのに対し、git fetchでは作業ディレクトリへのコピーが行われない点たが、それぞれをどう使い分ければいいのか。

Share
Tweet
LINE
Hatena

 TechTargetは2024年6月14日(米国時間)、「git pull」と「git fetch」の違いを解説する記事を公開した。


git pullとgit fetchの違い(提供:TechTarget)

 「git fetch」と「git pull」の主な違いは、git pullではリモートリポジトリの変更が作業ディレクトリに直接コピーされるのに対し、git fetchでは作業ディレクトリへのコピーが行われない点にある。git fetchコマンドでは、リモートリポジトリの変更がローカルGitリポジトリのみにコピーされ、git pullコマンドでは、作業ディレクトリとローカルGitリポジトリの両方にコピーされる。

 git pullとgit fetchの違いを正しく理解するには、Gitインストールの構造を知っておかなければならない。

 Gitをインストールすると、ユーザーのワークステーションには次の項目が設定される。

  • ローカルGitリポジトリ(全てのブランチでのコミットの全履歴を保持)
  • 作業ディレクトリ(Gitが追跡するファイルを開発者がアクティブに編集および更新する場所)

git pull操作は、git fetch+git mergeと同じ

git pullコマンドのメリット

 GitHubなどのリモートリポジトリに新たに更新されたファイルがあることに気付いた開発者は、その変更をGitHubから自身のローカルリポジトリと作業ディレクトリの両方にコピーしたいと考えるだろう。

 このようなコピーができるのがgit pullコマンドだ。git pullコマンドは、ユーザーのローカルGitリポジトリと作業ディレクトリ内のファイルの両方を更新する。

 git pullコマンドは開発者に次の2つのメリットをもたらす。

  1. ローカルGitリポジトリとリモートリポジトリの同期を取ることができる
  2. ローカルファイルシステムのファイルが最新になる

 git pullコマンドには前提条件が1つある。作業ディレクトリ内にあるGitの追跡対象となるファイルとリモートリポジトリ内にある同じファイルの内容が異なる場合、ユーザーはそのファイルをアクティブに編集できなくなる。

 Gitは、ユーザーの作業ディレクトリ内のファイルがリモートリポジトリ内のファイルと異なることを検出すると、ユーザーの作業ディレクトリの更新を中止し、ローカルGitリポジトリのみを更新する。

git fetchコマンドのメリット

 Gitの追跡対象のファイルをアクティブに操作していても、リモートリポジトリの最新の変更でローカルリポジトリを更新するのであればgit fetchコマンドを使用する。

 git fetchコマンドは、リモートリポジトリ内の最新の変更を全てローカルリポジトリに反映しても、ローカル作業ディレクトリには変更を加えない。

 git fetchとgit pullのメリットの違いは、git fetchでは、リモートリポジトリの最新状態とコードをマージすることなく、ローカル作業ディレクトリ内でファイルの編集を続行できる点にある。

 git fetchを使用する場合、ローカルでのファイルの編集を終了し、そのファイルをコミットしてから、git mergeコマンドを実行することで、git fetchによって取り込んだファイルと自身が行った更新の同期を取ることができる。その結果、git fetchでリモートリポジトリから取り込んだ更新に合わせて作業ディレクトリが最新状態になる。

git fetchの持つもう一つのメリット

 git fetchのもう一つのメリットは、作業中のブランチがサーバ上のブランチよりも進んでいるか、遅れているかを確認できる点にある。

 下図には、git statusコマンドを実行して、サーバ上の「origin/master」ブランチが最新状態であることが表示されている。


git fetchを実行すると、コミットが幾つ進んでいるか、または遅れているかが分かる

 ただし、git fetchを実行すると、実際にはローカルブランチがサーバ上のマスターGitブランチ(origin/master)よりも3コミット遅れていることが示されている。

 ローカルブランチがサーバ上のブランチと比べてどれだけ進んでいるか、遅れているかは、git fetchコマンドとgit statusコマンドを使用することで把握できる。

中止されたgit pullはgit fetchと同じ

 git pullコマンドを実行しようとしても、作業ディレクトリにコミットしていないファイルがあったり、リモートファイルを作業ディレクトリにコピーするとマージ競合が発生したりする場合、git pullコマンドは中止され、git fetch操作に変更される。リモートリポジトリ内の全ての更新はローカルGitリポジトリにコピーされるが、ローカルの作業ディレクトリは更新されない。

 これは、git pullが実際には2つの操作(git fetchコマンドとgit mergeコマンド)を1つに組み合わせるものだという事実を浮き彫りにする。git fetchコマンドとgit mergeコマンドを連続して適切に実行すると、git pullコマンドを実行したのと同じになる。

git fetchとgit pullのどちらを使用するか

 作業ディレクトリにコミットしていないファイルがなく、リモートリポジトリ内の最新の変更を直接作業ディレクトリにコピーする場合は、git pullコマンドを実行する。

 作業ディレクトリを上書きせずにリモートリポジトリ内の最新の変更を取り込む場合はgit fetchコマンドを使用し、適切なタイミングでgit mergeを実行する。


Git pullとfetchは、リモートGitHubまたはGitLabリポジトリからの変更をローカルでコピーする

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る