gitコマンドで、git checkoutを使用する方法について書いています。
git checkoutコマンドを実際に使用して解説しています。解説している内容は下記になります。
・リモートからブランチを取得して切り替える
・履歴からファイルを復元する
gitのcheckoutを使うとブランチを切り替えたり、gitの履歴からファイルを復元することが可能です。
Gitのバージョン2.32.0で確認しています。
git checkoutでブランチを切り替える
git checkoutコマンドを使用して、ブランチを切り替えるには下記のように行います。
$ git checkout newBranch
git checkoutの後にブランチ名を記載して実行することで、ブランチを切り替えることが可能です。
対象のリポジトリディレクトリ配下で実行します。
mainブランチからtestブランチに切り替えてみます、実際に下記のように使用してみました。
$ git checkout test
実行すると、下記のようになります。
$ git checkout test
Switched to branch 'test'
ブランチがtestブランチに切り替わりました。
現在のブランチについては、下記のようにgit branchコマンドを実行すると確認可能です。
存在するブランチが一覧表示されます。
$ git branch
main
* test
現在の使用しているブランチにはアスタリスク(*)が付きますので、これで確認可能です。
git checkoutでリモートからブランチを取得する
git checkoutでブランチを切り替えることが可能ですが、ローカルにないブランチの場合はリモートから取得して切り替えてくれます。
例えば、現在のブランチを確認すると、下記のようにmainブランチになっています。
他のブランチはローカルに存在していません。
$ git branch
* main
この時にリモートのブランチを取得して、ブランチを切り替えることが可能です。
ローカルになくて、リモートにあるブランチは、下記のようにgit branchに-a
オプションをつけると確認できます。
$ git branch -a
* main
remotes/origin/HEAD -> origin/main
remotes/origin/main
remotes/origin/test
リモートにあるtestブランチに切り替えてみます。
$ git checkout test
Branch 'test' set up to track remote branch 'test' from 'origin'.
Switched to a new branch 'test'
上記のようにtestブランチに切り替わりました。
リモートブランチが見つからない場合は?
ブランチがリモートにあるのに、見つからない場合です。
GitHubなどのリモートリポジトリを確認すると、test2ブランチがあるのに見つからない場合です。
切り替えようとすると下記のようにメッセージが返ってきます。
$ git checkout test2
error: pathspec 'test2' did not match any file(s) known to git
git branchの-a
オプションで確認しても、下記のようにtest2ブランチがないです。
git branch -a
* main
test
remotes/origin/HEAD -> origin/main
remotes/origin/main
remotes/origin/test
この場合はリモートにブランチが存在するという情報が取得できていないので、git fetchコマンドを使用します。
実際に使用すると、下記のようにリモート(origin)の最新ブランチ情報が取得できました。
$ git fetch
From github.com:xxx/xxx
* [new branch] test2 -> origin/test2
git branchの-a
オプションで確認すると、取得できたことがわかります。
$ git branch -a
* main
test
remotes/origin/HEAD -> origin/main
remotes/origin/main
remotes/origin/test
remotes/origin/test2
ブランチ情報の取得後は、下記のようにリポジトリ切り替えが可能になります。
$ git checkout test2
Branch 'test2' set up to track remote branch 'test2' from 'origin'.
Switched to a new branch 'test2'
git checkoutで履歴からファイルを復元する
git checkoutコマンドを使用してコミット履歴から全てのファイルや、一部のファイルを復元することが可能です。
特定のコミット履歴を復元する
特定のコミット履歴の位置まで、ファイルの状態を戻すことが可能です。
まずは、コミット番号をgit logコマンドで確認します。
$ git log
commit 3e20d6b7dc7b01ede0c090e95cf1c2335c584d72 (HEAD -> main, origin/test2, origin/main, origin/HEAD, test2)
Author: yasuaki <xxx@example.com>
Date: Sun May 8 21:04:52 2022 +0900
add test model
commit e09960b6ac6433c73e4887e18dcec60a4318b5ee (origin/test, test)
Author: yasuaki <xxx@example.com>
Date: Sat Apr 30 00:18:31 2022 +0900
logger tester
commit c68b236e0a927870d5a5bdafbf59ada123f79afc
Author: yasuaki <xxx@example.com>
Date: Thu Apr 21 15:15:39 2022 +0900
output sql test
3番目のコミット位置まで、戻ってみます。
下記のようにgit checkoutの後に、コミット番号を記載します。
$ git checkout c68b236e0a927870d5a5bdafbf59ada123f79afc
実行すると、下記のように表示されてファイルやディレクトリなど、指定したコミット番号の時の状態に戻っています。
その時のファイル内容を確認したり、取得することが可能です。
$ git checkout c68b236e0a927870d5a5bdafbf59ada123f79afc
Note: switching to 'c68b236e0a927870d5a5bdafbf59ada123f79afc'.
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.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
元の状態に戻るには、下記のようにgit switchコマンドを使用します。
$ git switch -
特定のコミット番号のファイルを取得したい
特定のコミット番号のファイルを取得することも可能です。
この場合は「git checkout コミット番号 ファイルパス
」で、実行します。
例えば、下記のように実行します。
指定したコミット番号の状態に、routes/web.php
ファイルが戻ります。
$ git checkout c68b236e0a927870d5a5bdafbf59ada123f79afc routes/web.php
ディレクトリを指定することも可能です。
下記のようにすると、その時のコミット番号の状態にディレクトリ配下のファイルが更新されます。
$ git checkout c68b236e0a927870d5a5bdafbf59ada123f79afc routes
そのコミット番号の時になかったファイルは、消えることなく残ります。
ファイルの内容がその時の状態に戻るイメージになります。
コメント
checkoutのやり方から教えてください
コメントありがとうございます。
svnのcheckoutのような機能ということでしょうか。
gitではcloneを使います。下記をご確認ください。
https://codelikes.com/git-clone/