TAKASHI YAMASHINA software engineer

git fetchが不要な理由

多くの場合、git fetchを明示的に実行する必要はありません。git pullを使えば、リモートの変更を取得してマージまで一度に完了できます。

git pullを使う

リモートの変更を取得してローカルに反映するには、git pullを使います。

bash
git pull

git pullは内部的に以下の2つのコマンドを実行します:

  1. git fetch - リモートの変更を取得
  2. git merge - 取得した変更をローカルブランチにマージ

特定のブランチをpull

現在のブランチ以外のブランチをpullする場合:

bash
git pull origin main

rebaseしながらpull

マージコミットを作らずに、リベースしながらpullする場合:

bash
git pull --rebase

または設定で常にrebaseを使うようにする:

bash
git config --global pull.rebase true

git fetchが必要なケース

以下の場合はgit fetchを単独で使う必要があります:

1. リモートの状態を確認したいが、マージはしたくない

bash
git fetch
git log HEAD..origin/main  # リモートとローカルの差分を確認

2. 複数のリモートブランチを一度に取得

bash
git fetch --all

3. 削除されたリモートブランチの情報を更新

bash
git fetch --prune

なぜgit pullの方が効率的か

1. ステップが少ない

git fetchを使うワークフロー:

bash
git fetch           # ステップ1: リモートの変更を取得
git log HEAD..origin/main  # ステップ2: 差分確認(任意)
git merge origin/main      # ステップ3: マージ

git pullを使うワークフロー:

bash
git pull  # 取得とマージを一度に実行

2. タイプ量が少ない

日常的な作業では、リモートの変更を取得したらすぐにマージすることがほとんどです。その場合、git pull一回で完結します。

3. マージ忘れを防ぐ

git fetchの後、マージを忘れてそのまま作業を続けてしまうミスを防げます。

4. 初心者にとってシンプル

Gitを学び始めた人にとって、fetchpullの違いを理解するのは難しいです。基本的にはgit pullを使い、必要な場合のみgit fetchを使うという方針の方が分かりやすいです。

git fetchを使うべきでない理由

1. 中途半端な状態を作りやすい

git fetchを実行すると、リモートの情報は更新されますが、ローカルブランチには反映されません。この「リモートは取得済みだがローカルは古い」という中途半端な状態が、混乱を招くことがあります。

2. 操作の手間が増える

ほとんどの場合、fetchの後にはmergeやrebaseを実行します。最初からgit pullを使えば、この手間を省けます。

3. コンフリクト解決が遅れる

git fetchだけでは、リモートとの差分は分かっても、実際のコンフリクトは検出されません。早めにgit pullでマージすることで、コンフリクトを早期に発見できます。