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の違い
まず、fetchとpullの違いを整理する。
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は更新されるが、ローカルのmainはBのままである。
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の「変更の同期」ボタンである。
同期を実行すると、リモートとローカルの状態に応じて、pullやpushが行われる。
そのため、ターミナルではfetchだけを実行したつもりでも、別のタイミングでVS Codeの同期ボタンを押していれば、リモートの変更がローカルへ反映されることがある。
git logで現在の状態を確認した
まず、次のコマンドを実行した。
git log --oneline --decorate --graph --all -10
結果は次のようになった。
* 8f1036a (HEAD -> main, origin/main) 行間を広げた
* e95fdb4 技術ブログの追加
* cc91541 Paizaのデータ最適化
* b0110aa 修正
* 3288e21 技術記事の追加
ローカルのmainとorigin/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では、mainとorigin/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 logとgit reflogを確認することで、何が実行されたのかを追跡できる。