2026.07.22(水) / 02:06

VS Codeの同期ボタンでgit pullが実行されていたことをreflogで確認した

ID
40278
Published
2026-07-22 02:06
Modified
2026-07-22 02:06
Author
khiro
Categories
デフォルト

FastAPIで作成しているMy Portfolioを更新していたところ、git fetchを実行しただけなのに、リモートの変更がローカルにも反映されたように感じた。

通常、git fetchだけでは、現在作業しているローカルブランチやファイルは更新されない。

何が起きたのか確認したところ、VS Codeの左下にある同期ボタンを押したことで、実際にはgit pullが実行されていたことが分かった。

git fetchとgit pullの違い

まず、fetchpullの違いを整理する。

git fetch

git fetch origin

git fetchは、リモートリポジトリの最新情報を取得するコマンドである。

ただし、通常は現在作業しているローカルブランチやファイルには反映しない。

更新されるのは、主に次のようなリモート追跡ブランチである。

origin/main

たとえば、ローカルのmainがコミットB、GitHub側のmainがコミットCまで進んでいる場合、fetch後は次の状態になる。

main         A---B
origin/main  A---B---C

origin/mainは更新されるが、ローカルのmainBのままである。

git pull

git pull origin main

git pullは、リモートの変更を取得したうえで、現在のローカルブランチへ反映する。

基本的には、次の処理を連続して行うコマンドである。

git fetch origin
git merge origin/main

そのため、git pullを実行すると、ローカルのコードやファイルも変更される可能性がある。

VS Codeの同期ボタンを押していた可能性があった

VS Codeの左下には、現在のブランチ名が表示されている。

今回は、mainの右側に表示されていた丸い矢印のボタンを押していた可能性があった。

このボタンは単なるfetchボタンではなく、VS Codeの「変更の同期」ボタンである。

同期を実行すると、リモートとローカルの状態に応じて、pullpushが行われる。

そのため、ターミナルではfetchだけを実行したつもりでも、別のタイミングでVS Codeの同期ボタンを押していれば、リモートの変更がローカルへ反映されることがある。

git logで現在の状態を確認した

まず、次のコマンドを実行した。

git log --oneline --decorate --graph --all -10

結果は次のようになった。

* 8f1036a (HEAD -> main, origin/main) 行間を広げた
* e95fdb4 技術ブログの追加
* cc91541 Paizaのデータ最適化
* b0110aa 修正
* 3288e21 技術記事の追加

ローカルのmainorigin/mainが、どちらも8f1036aを指している。

ただし、この結果だけでは、どの操作によって同じ位置になったのかまでは分からない。

そこで、git reflogを確認した。

git reflogでpullの実行履歴を確認した

次のコマンドを実行した。

git reflog -10 --date=local

結果には、次の記録が残っていた。

cc91541 HEAD@{Wed Jul 22 01:25:50 2026}: pull --tags origin main: Fast-forward

この記録から、2026年7月22日1時25分に、次の操作が実行されていたことが分かる。

git pull --tags origin main

つまり、fetchだけでローカルへ変更が反映されたのではなく、実際にはpullが実行されていた。

Fast-forwardの意味

履歴には、次のように表示されていた。

pull --tags origin main: Fast-forward

Fast-forwardは、ローカル側に独自の分岐がなく、そのままリモート側の最新コミットまで進められたことを意味する。

たとえば、実行前が次の状態だったとする。

A---B  main
     \
      C---D  origin/main

実際にはローカル側で別のコミットが増えていないため、mainの位置をそのままDまで進められる。

A---B---C---D  main, origin/main

新しいマージコミットを作る必要がなく、競合も発生しなかったため、履歴上ではFast-forwardと表示された。

8f1036a (HEAD -> main, origin/main)の意味

Gitのログには、次のような表示があった。

8f1036a (HEAD -> main, origin/main)

これは、複数の参照が同じコミットを指していることを表している。

8f1036a

8f1036aは、コミットIDの短縮形である。

今回のコミットメッセージは次のとおりだった。

行間を広げた

GitのコミットIDは本来もっと長い文字列だが、ログでは識別に必要な先頭部分だけが表示される。

HEAD

HEADは、現在Git上で自分がいる位置を表す。

今回は、次のように表示されている。

HEAD -> main

これは、現在mainブランチを開いているという意味である。

main

mainは、ローカルリポジトリ内のブランチである。

HEAD
  ↓
main
  ↓
8f1036a

現在作業しているローカルのmainは、コミット8f1036aを指している。

origin/main

origin/mainは、リモートリポジトリのmainの状態をローカルに記録した、リモート追跡ブランチである。

origin/main
     ↓
  8f1036a

origin/mainも同じコミットを指しているため、全体では次の状態になっている。

HEAD
  ↓
main
  ↓
8f1036a
  ↑
origin/main

つまり、ローカルのmainと、ローカルに記録されているリモートのmainが同じコミットを指している。

ローカルとリモートが同期している状態である。

pushがreflogに表示されない理由

git logでは、mainorigin/mainが同じコミットを指していた。

一方、git reflogには、直近のpushという表示はなかった。

これは、pushが通常、ローカルのHEADを移動させないためである。

git reflogは、主にHEADやブランチの位置がどのように動いたかを記録する。

pullによってローカルのmainが進んだ場合は記録されるが、ローカルのコミットをリモートへ送るだけのpushは、通常はHEADの移動を伴わない。

そのため、pushを実行しても、git reflogには分かりやすい形で残らないことがある。

fetchだけを実行したい場合

リモートの最新情報だけを取得し、ローカルのコードにはまだ反映したくない場合は、ターミナルから次のコマンドを実行する。

git fetch origin

取得後の状態は、次のコマンドで確認できる。

git status -sb

ローカルがリモートより1コミット遅れている場合は、次のように表示される。

## main...origin/main [behind 1]

リモートにだけ存在するコミットは、次のコマンドで確認できる。

git log HEAD..origin/main --oneline

ファイルの差分を確認する場合は、次のコマンドを使用する。

git diff HEAD origin/main

内容を確認してから反映する場合は、次のように進められる。

git fetch origin
git log HEAD..origin/main --oneline
git diff HEAD origin/main
git merge origin/main

今回の学び

git fetchは、リモートの最新情報を取得するが、通常は現在のローカルブランチへ反映しない。

git fetch origin

git pullは、リモートの情報を取得し、現在のローカルブランチへ反映する。

git pull origin main

VS Codeの丸い矢印は、単なるfetchではなく「変更の同期」を行うボタンである。

今回のように、意図せずリモートの変更が反映されたと感じた場合は、次のコマンドで実際の操作履歴を確認できる。

git reflog -10 --date=local

現在のローカルブランチとリモート追跡ブランチの位置関係は、次のコマンドで確認できる。

git log --oneline --decorate --graph --all -10

Gitで想定外の変更が起きたときは、感覚だけで判断せず、git loggit reflogを確認することで、何が実行されたのかを追跡できる。