Git Fetch と Git Pull の違い

John Wachira 2024年2月15日
  1. Git Fetch とは
  2. Git Pull とは
  3. Git Fetch と Git Pull の違い
Git Fetch と Git Pull の違い

この記事では、git pull コマンドと git fetch コマンドの実際の使用法について説明し、それらの違いと使用時期を確認します。

Git Fetch とは

リモートリポジトリには、以下に示すファイルがあります。

リモートリポジトリ

念のために言っておきますが、リモートリポジトリとローカルリポジトリは同期しています。リモートリポジトリの Sample.txt ファイルを変更してみましょう。

ファイルにランダムなものを書き込み、変更をコミットします。

更新されたファイル

この時点で、リモートリポジトリには 2つのコミットがあり、ローカルリポジトリには 1つのコミットがあります。これは、ローカルリポジトリを更新する必要があることを意味します。

この時点で git fetch は便利です。git log コマンドを実行して、ローカルリポジトリのコミット履歴を確認しましょう。

コミット履歴

ローカルリポジトリには、Updated Sample.txt コミットがありません。git fetch を使用して変更を確認します。

pc@JOHN MINGW64 ~/Git/Delftscopetech (main)
$ git fetch
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 709 bytes | 2.00 KiB/s, done.
From https://github.com/Wachira11ke/Delftscopetech
   c43169e..2445daf  main       -> origin/main

上記のコマンドから、メインブランチに対して行われたリモートリポジトリの変更を確認できます。git merge コマンドを使用して、これらの変更をローカルリポジトリに適用できます。

pc@JOHN MINGW64 ~/Git/Delftscopetech (main)
$ git merge origin main
Updating c43169e..2445daf
Fast-forward
 Sample.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

git log コマンドを実行して、コミット履歴を確認しましょう。

$ git log
commit 2445dafc118748a5cb53c5262b393ab0e1a9e235 (HEAD -> main, origin/main, origin/HEAD)
Author: Wachira11ke <100116527+Wachira11ke@users.noreply.github.com>
Date:   Tue Mar 15 22:07:11 2022 +0300
    Update Sample.txt
    First Update
commit c43169e587ab7ab996087ff460e54032e83030f0
Author: Wachira11ke <100116527+Wachira11ke@users.noreply.github.com>
Date:   Tue Mar 15 21:45:50 2022 +0300
    Second commit
commit b2f77108396c9ae867d8e9d69c575eda99dd1436
Author: Wachira11ke <100116527+Wachira11ke@users.noreply.github.com>
Date:   Mon Feb 21 10:00:23 2022 +0300
    Initial commit

この時点で、ローカルリポジトリとリモートリポジトリの両方が同期しています。git pull コマンドを見てみましょう。

Git Pull とは

リモートリポジトリに戻って、ファイルにさらに変更を加えましょう。ランダムな図を書き、変更をコミットします。

これで、リモートリポジトリにはローカルリポジトリよりも 1つ多くのコミットがあります。git pull コマンドを実行して、ローカルリポジトリを更新できます。

pc@JOHN MINGW64 ~/Git/Delftscopetech (main)
$ git pull origin main
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 730 bytes | 3.00 KiB/s, done.
From https://github.com/Wachira11ke/Delftscopetech
 * branch            main       -> FETCH_HEAD
   2445daf..8089f2b  main       -> origin/main
Updating 2445daf..8089f2b
Fast-forward
 Sample.txt | 1 +
 1 file changed, 1 insertion(+)

これで、ローカルリポジトリがリモートリポジトリで最新になりました。git pull は複合コマンド(git fetch+git merge)であると結論付けることができます。

変更を直接フェッチしてマージします。

Git Fetch と Git Pull の違い

Git fetch Git pull
リモートリポジトリに加えられた変更をチェックします。 リモートリポジトリからの変更をローカルリポジトリに直接マージします。
フェッチされた変更は、.git フォルダーに更新されます。 変更はローカルリポジトリに直接行われます。
マージする前にコミットを確認できます。 変更はすぐに更新されます。
競合が発生することはめったにありません。 マージの競合が発生する可能性があります。
著者: John Wachira
John Wachira avatar John Wachira avatar

John is a Git and PowerShell geek. He uses his expertise in the version control system to help businesses manage their source code. According to him, Shell scripting is the number one choice for automating the management of systems.

LinkedIn

関連記事 - Git Pull

関連記事 - Git Fetch