gitコマンドの使い方 ~ git checkout ~

2020年4月26日git-command

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

Gitコマンドの使い方一覧

git-command

Posted by snow