GIT VISUALIZER

git checkout / git switch

ブランチを切り替えると HEAD が移動し、Working Directory のファイルが切り替わります

初期状態
git log --oneline --all --graph
main ブランチにいます。Working Directory には README.md と app.ts があります。
ステップ制御
進捗1 / 5
COMMIT GRAPHSTEP 1
WORKING DIRECTORY
HEAD → main のファイル
📄README.md
📝app.ts
CODE VIEW
$ git log --oneline --all --graph
* C2 (HEAD -> main) Add app.ts
| * C3 (feature) Add feature.ts
|/
* C1 Initial commit
main ブランチ
feature ブランチ
追加されるファイル
削除されるファイル
CHECKOUT ステップログ
1git log --oneline --all --graph
2git checkout feature
3git status(feature ブランチ)
4git checkout main
5git log --oneline --all --graph(完了)
解説

📌
git checkout とは

git checkout は、HEAD の参照先を別のブランチに切り替え、Working Directory のファイルをそのブランチのスナップショットに差し替えるコマンドです。

Git 2.23 以降では、ブランチ切替専用の git switch が推奨されています。git checkout はブランチ切替とファイル復元の両方を担っていたため、役割を分離する目的で導入されました。

切替時にファイルが「消える」ように見えますが、Git のデータベース(.git/objects/)にはすべて残っています。元のブランチに戻ればファイルはそのまま復活します。

⚙️
内部で起きている3つの処理

1
HEAD の参照先を変更
.git/HEAD の中身が ref: refs/heads/main → ref: refs/heads/feature に書き換わります。
2
Index(ステージングエリア)を更新
切替先コミットの tree に合わせて、Index のファイル一覧を差し替えます。
3
Working Directory のファイルを差し替え
ディスク上のファイルを実際に書き換えます。これが「ファイルが消えた / 現れた」に見える部分です。
ポイント: ブランチポインタ(main, feature)は一切変わりません。変わるのは HEAD の参照先だけです。

🧩
git checkout vs git reset

git checkout / switch
HEAD の参照先を別のブランチに変える。ブランチポインタは動かない
git reset
ブランチポインタを動かす。HEAD はそのブランチを指したまま。
checkout: HEAD が移動
C1C2mainC3featureHEADHEADHEAD だけが移動するブランチは不変
reset: ブランチポインタが移動
C2HEADC1mainmainHEAD は C2 に留まったままmain だけがC1 に移動

💻
コマンド

git checkout [ブランチ名]ブランチを切り替える
git switch [ブランチ名]ブランチを切り替える(推奨)
git checkout -b [新ブランチ名]新ブランチを作成して切り替え
git switch -c [新ブランチ名]新ブランチを作成して切り替え(推奨)

🚨
未コミットの変更がある場合

切り替え先のブランチで上書きされるファイルに未コミットの変更がある場合、エラーで中断します。これは変更を失わないための安全機構です。

error: Your local changes to the following files would be overwritten by checkout:
app.ts
Please commit your changes or stash them before you switch branches.
対処法:
1
git stash → checkout → git stash pop
2
git commit してから checkout
3
git checkout --force(変更を破棄して強制切替 — 危険)

関連コンテンツ