gitコマンドの使い方 ~ git checkout ~
git checkout コマンド概要
git checkoutコマンドの基本的な使い方は、指定したcommitのディレクトリ(treeオブジェクト)およびファイル(blobオブジェクト)をstaging-area(ステージングエリア)とworking-directory(作業ディレクトリ)に展開することです。
git checkoutコマンドで以下の3パターンの利用方法について説明します。
- 指定したcommitの内容を展開する
- 指定したcommitのディレクトリやファイルの内容を展開する
- staging-area(ステージングエリア)の指定したディレクトリやファイルを展開する
指定したcommitの内容を展開する
git checkout [commit-hash]
git checkout [branch]
git checkout [tag]
指定したcommit-hash、branch、tagが示すcommitをstaging-area(ステージングエリア)とworking-directory(作業ディレクトリ)に展開します。
以下の例は、masterブランチからdevelopブランチをcheckoutし、もう一度masterブランチをcheckoutした場合です。
(master)
$ ls
file-A.txt file-B.txt file-C.txt file-D.txt file-E.txt
(master)
$ git ls-files
file-A.txt
file-B.txt
file-C.txt
file-D.txt
file-E.txt
(master)
$ git checkout develop
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.
(develop)
$ ls
dir-A/ file-A.txt file-B.txt file-BB.txt file-C.txt file-CC.tt
(develop)
$ git ls-files
dir-A/file-AAA.txt
file-A.txt
file-B.txt
file-BB.txt
file-C.txt
file-CC.tt
(develop)
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
(master)
$ ls
file-A.txt file-B.txt file-C.txt file-D.txt file-E.txt
(master)
$ git ls-files
file-A.txt
file-B.txt
file-C.txt
file-D.txt
file-E.txt
指定したブランチがない場合
指定したブランチが存在しない場合はエラーとなります。
(master)
$ git branch
develop
* master
(master)
$ git checkout branch-test
error: pathspec 'branch-test' did not match any file(s) known to git
但し、指定したブランチに対応するremote-tracking-branch(リモート追跡ブランチ)が存在する場合は対応するブランチが作成され自動的に切り替わります。
(master)
$ git branch
develop
* master
(master)
$ git branch -d develop
warning: deleting branch 'develop' that has been merged to
'refs/remotes/origin/develop', but not yet merged to HEAD.
Deleted branch develop (was 2ef4b57).
(master)
$ git branch
* master
(master)
$ git branch -a
* master
remotes/origin/develop
remotes/origin/master
(master)
$ git checkout develop
Switched to a new branch 'develop'
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
(develop)
$ git branch -a
* develop
master
remotes/origin/develop
remotes/origin/master
checkoutを取り消したい場合
直前に行ったcheckoutを取り消したい場合は以下のコマンドを実行すると、checkout前の状態に戻すことができます。
git switch -
以下の例は、masterブランチからdevelopブランチをcheckoutし、取りやめてmasterブランチがcheckoutされた状態に戻しています。
(master)
$ git branch
develop
* master
(master)
$ git checkout develop
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.
(develop)
$ git branch
* develop
master
(develop)
$ git switch -
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
(master)
$ git branch
develop
* master
指定したcommitのディレクトリやファイルの内容を展開する
git checkout [commit-hash] [dir-path | file-path]
git checkout [branch] [dir-path | file-path]
git checkout [tag] [dir-path | file-path]
git checkoutはcommit単位だけでなく、ディレクトリ単位やファイル単位にcheckoutすることができます。
以下の例は、working-directory(作業ディレクトリ)のファイルを全て削除した後に、masterブランチの「file-A.txt」を指定してcheckoutしています。
(master)
$ ls
file-A.txt file-B.txt file-C.txt file-D.txt file-E.txt
(master)
$ rm *
(master)
$ ls
(master)
$ git checkout master file-A.txt
Updated 1 path from 057fb19
(master)
$ ls
file-A.txt
staging-area(ステージングエリア)の指定したディレクトリやファイルを展開する
git checkout -- [dir-path | file-path]
git checkout [dir-path | file-path]
git checkoutはcommitからではなく、staging-area(ステージングエリア)からworking-directory(作業ディレクトリ)へcheckoutすることができます。
「–」はcommitではなくstaging-area(index)からという意味です。
「–」を指定しない場合でもstaging-area(index)からcheckoutされるがファイル名と同名のブランチが存在する場合に挙動が異なるため、staging-areaからcheckoutしたい場合は、明示的に「–」を指定する方がよい
以下の例は、working-directory(作業ディレクトリ)のファイルを全て削除した後に、staging-area(ステージングエリア)の「file-A.txt」を指定してcheckoutしています。
(master)
$ ls
file-A.txt file-B.txt file-C.txt file-D.txt file-E.txt
(master)
$ git ls-files
file-A.txt
file-B.txt
file-C.txt
file-D.txt
file-E.txt
(master)
$ rm *
(master)
$ ls
(master)
$ git checkout -- file-A.txt
(master)
$ ls
file-A.txt
git checkout オプション
-b
git checkout -b [branch]
HEADのcommitでブランチを作成した後に、指定したブランチでcheckoutした状態にします。
以下の例は、masterブランチをcheckoutしている状態から、branch-testを作成しcheckoutしています。
(master)
$ ls
file-A.txt file-B.txt file-C.txt file-D.txt file-E.txt
(master)
$ git branch
develop
* master
(master)
$ git checkout -b branch-test
Switched to a new branch 'branch-test'
(branch-test)
$ ls
file-A.txt file-B.txt file-C.txt file-D.txt file-E.txt
(branch-test)
$ git branch
* branch-test
develop
master
git checkout -b [branch] [branch | remote-tracking-branch]
指定したブランチやremote-tracking-branch(リモート追跡ブランチ)からブランチを作成した後に指定したブランチでcheckoutした状態にする。
以下の例は、masterブランチをcheckoutしている状態から、developブランチを元にbranch-testを作成しcheckoutしています。
(master)
$ git branch
develop
* master
(master)
$ git checkout -b branch-test develop
Switched to a new branch 'branch-test'
(branch-test)
$ git branch
* branch-test
develop
master
-f
git checkout -f [commit-hash | branch]
working-directory(作業ディレクトリ)でファイルを更新している場合、commit もしくは stashしていない状態ではcheckoutすることができない。
-fオプションを指定することでファイルの変更を無視してcheckoutすることができる
以下の例は、file-A.txtに変更を行いstaging-areaへaddした状態から、developブランチへcheckoutを行う例です。
-fオプションを指定しない場合にエラーを発生させた後に-fオプションを指定してcheckoutできることを確認しています。
(master)
$ echo 'aaa' >> file-A.txt
(master)
$ git add .
(master)
$ git checkout develop
error: Your local changes to the following files would be overwritten by checkout:
file-A.txt
Please commit your changes or stash them before you switch branches.
Aborting
(master)
$ git checkout -f develop
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.
(develop)
$ git branch
* develop
master
git checkout の全てのオプションを確認する方法
以下のコマンドを実行するとブラウザでgit checkoutのヘルプページが表示される
git checkout --help