HOWTO · Git
Git Fetch と Git Pull の違い
この記事では、gitpull コマンドと gitfetch コマンドの実際の使用法について説明し、この 2つがどのように異なり、いつ使用するのが適切かを確認します。
このページの内容
この記事では、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 フォルダーに更新されます。 |
変更はローカルリポジトリに直接行われます。 |
| マージする前にコミットを確認できます。 | 変更はすぐに更新されます。 |
| 競合が発生することはめったにありません。 | マージの競合が発生する可能性があります。 |