git checkout コマンドは、ブランチ・コミット・タグの切り替えや、ファイルを特定時点の状態に戻すために使う、Git の中心的なコマンドです。
Git 2.23 以降では一部の役割が git switch / git restore に分離されましたが、git checkout は引き続き広く使われており、旧来の環境との互換性も高いため実務でも頻繁に登場します。
目次
構文(Syntax)
git checkout [オプション] <ブランチ名>
git checkout [オプション] <コミットID> [--] <ファイル>
git checkout <タグ名>
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
<ブランチ名> | 指定ブランチに切り替え | git checkout develop |
-b <新ブランチ名> | 新しいブランチを作成して切り替え | git checkout -b feature-x |
-B <ブランチ名> | ブランチが存在する場合は強制リセットして切り替え | git checkout -B hotfix |
<コミットID> | 特定のコミットに切り替え(detached HEAD 状態) | git checkout abc1234 |
<タグ名> | タグが指すコミットに切り替え(detached HEAD 状態) | git checkout v1.0.0 |
<コミットID> -- <ファイル> | ファイルを特定コミット時の状態に戻す | git checkout abc1234 -- app.py |
-- <ファイル> | 変更を破棄して最新コミットの状態に戻す | git checkout -- README.md |
-t / --track | リモートブランチをトラッキングしてローカルに作成 | git checkout -t origin/feature-x |
実行例
既存のブランチに切り替え
git checkout develop
出力例:
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.
未コミットの変更がある場合はエラーになることがあります。その場合は先に git stash で変更を退避してから切り替えてください。
新しいブランチを作成して切り替え
git checkout -b feature-login
出力例:
Switched to a new branch 'feature-login'
特定のブランチやコミットを起点にして新ブランチを作ることもできます。
# main ブランチを起点に新しいブランチを作成
git checkout -b hotfix/bug-123 main
リモートブランチをローカルに持ってくる
チームメンバーが作成したリモートブランチをローカルで作業する場合、まず git fetch でリモートの情報を取得してから切り替えます。
# リモートの最新情報を取得
git fetch origin
# リモートブランチをローカルに作成して切り替え
git checkout -b feature-api origin/feature-api
短縮形として以下も使えます(ブランチ名がリモートと同名の場合に自動トラッキング)。
git checkout feature-api
出力例:
Branch 'feature-api' set up to track remote branch 'feature-api' from 'origin'.
Switched to a new branch 'feature-api'
タグをチェックアウトする
リリースバージョンの確認や過去バージョンへの調査目的で、特定タグのコードを見たいときに使います。
git checkout v1.2.0
出力例:
Note: switching to 'v1.2.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
タグのコードを編集して保存したい場合は、detached HEAD のまま作業せず、新しいブランチを作成してから作業してください。
# タグから新しいブランチを作成して作業
git checkout -b fix/v1.2.0-patch v1.2.0
過去のコミットに切り替え(detached HEAD)
git checkout abc1234
出力例:
Note: switching to 'abc1234'.
You are in 'detached HEAD' state...
detached HEAD 状態とは、ブランチの先頭ではなくコミット単体を参照している状態です。この状態で新しいコミットをしても、ブランチに結びついていないため git checkout でブランチに戻ると孤立します。調査目的以外では、必ず新しいブランチを作成してから作業しましょう。
特定ファイルを以前の状態に戻す
# 特定のコミット時点のファイルを復元
git checkout abc1234 -- config.yaml
# 1つ前のコミット時点に戻す
git checkout HEAD~1 -- config.yaml
ファイルはステージングエリアに追加された状態で復元されます。内容を確認してから git commit してください。
変更を破棄して最新コミットの内容に戻す
# 1ファイルの変更を破棄
git checkout -- app.py
# カレントディレクトリ以下の全変更を破棄
git checkout -- .
この操作は元に戻せません。変更を完全に失ってしまうため、慎重に実行してください。
エラー例(存在しないブランチ)
git checkout notfound
出力例:
error: pathspec 'notfound' did not match any file(s) known to git
ブランチ名のスペルミスか、リモートのフェッチ漏れが原因です。git branch -a で存在するブランチを確認し、リモートブランチの場合は先に git fetch を実行してください。
git switch / git restore との違い
Git 2.23 から、git checkout が担っていた2つの役割(ブランチ切り替えとファイル復元)が専用コマンドに分離されました。
| 目的 | 旧コマンド(git checkout) | 新コマンド |
|---|---|---|
| ブランチの切り替え | git checkout <ブランチ名> | git switch <ブランチ名> |
| 新ブランチを作成して切り替え | git checkout -b <ブランチ名> | git switch -c <ブランチ名> |
| ファイルの復元・変更破棄 | git checkout -- <ファイル> | git restore <ファイル> |
| ステージ済み変更をアンステージ | — | git restore --staged <ファイル> |
| タグ・コミットへの切り替え | git checkout <タグ/コミット> | git switch --detach <タグ/コミット> |
git switch の特徴
git switch はブランチ切り替え専用コマンドです。git checkout との大きな違いは、ブランチ名とファイル名が同一のときに誤ってファイルを上書きする事故を防げる点です。たとえば main というファイルが存在する場合、git checkout main はブランチに切り替えるのかファイルを復元するのか曖昧になりますが、git switch main はブランチ切り替えに限定されます。
git restore の特徴
git restore はファイルの復元・変更破棄専用コマンドです。git checkout -- <ファイル> と同等の操作に加え、--staged オプションでステージングエリアからファイルをアンステージ(git add の取り消し)できる点が便利です。
# ワーキングディレクトリの変更を破棄(git checkout -- と同等)
git restore app.py
# ステージ済みの変更をアンステージ
git restore --staged app.py
# 特定コミット時点のファイルに戻す(git checkout <commit> -- と同等)
git restore --source=abc1234 config.yaml
どちらを使うべきか
- 新規プロジェクト・モダンな環境:
git switch(ブランチ切り替え)/git restore(ファイル復元)を使うと意図が明確になりミスが減る - 既存のスクリプト・古い環境・Git 2.23 未満:
git checkoutを使う - タグやコミットへの調査目的の切り替え:
git checkout <タグ>は今も使いやすい選択肢
git checkout は将来的に非推奨になる可能性がありますが、現時点では削除予定はなく、ほぼすべての Git 環境で動作します。
ユースケース別まとめ
| やりたいこと | コマンド |
|---|---|
| 別ブランチに移動する | git checkout develop |
| 新ブランチを作って移動する | git checkout -b feature-x |
| リモートブランチをローカルに作る | git checkout -b feature-x origin/feature-x |
| リリースタグのコードを確認する | git checkout v1.0.0 |
| タグから修正ブランチを作る | git checkout -b hotfix/v1.0.1 v1.0.0 |
| 過去コミットを一時確認する | git checkout abc1234 |
| 1ファイルを特定コミットに戻す | git checkout abc1234 -- config.yaml |
| 1ファイルの変更を捨てる | git checkout -- app.py |
関連コマンド
- git branch : ブランチの作成・一覧・削除を行う。
git checkout -bでブランチを作成する前に確認することが多い。 - git switch : ブランチ切り替え専用の新コマンド(Git 2.23 以降)。
git checkout <ブランチ名>の後継。 git restore: ファイルの復元・変更破棄専用の新コマンド(Git 2.23 以降)。git checkout -- <ファイル>の後継。- git stash : 未コミットの変更を一時退避させてからブランチを切り替えたいときに使う。
- git fetch : リモートの最新情報を取得する。リモートブランチをチェックアウトする前に実行する。
- git commit : ステージされた変更を記録する。ファイル復元後に内容を確定するときに使う。
- git merge : ブランチを統合する。
git checkoutでブランチを切り替えた後に実行することが多い。 - git init : 新しいリポジトリを作成するコマンド。
git checkoutを使い始める前の最初のステップ。 - Git Bash : Windows 環境で
git checkoutを含む Git コマンドを使うためのシェル環境。
備考
- Git 2.23 以降では
git switch(ブランチ切り替え)とgit restore(ファイル復元)が導入され、git checkoutの役割が分離されました。新プロジェクトではこれらの使用が推奨されています。 detached HEAD状態でコミットをすると、ブランチに紐付かない孤立したコミットになります。そのまま別ブランチに移動すると参照が失われる可能性があるため、作業する場合は必ずgit checkout -b <新ブランチ名>でブランチを作成してください。git checkout -- <ファイル>による変更破棄は元に戻せません。作業中の変更を保持したい場合は、先にgit stashまたは別ブランチへのコミットをしてください。- ブランチ名とファイル名が同じ場合、
--を使って区別します(例:git checkout -- main)。
参考
- Git公式ドキュメント: https://git-scm.com/docs/git-checkout

コメント