Gitコマンド入門::checkout(branch,switch)「第四十一回」

9 min read読了の目安(約8700字

みなさんこんにちは! 今回は前回に引き続き、checkout,branchなど、ブランチ関連を学習しながら、GitHubへの操作コマンドも併せて学習して行きましょう! まあ~、簡単にポイントをいうと、checkout コマンドなどは、オプションスイッチを付けることによって、ブランチの切り替えと同時に、その他の処理も行うので、それを分解していくことで理解を深めるといったやり方ですね。そして、その状態を確認するコマンドも含めて進めて行きたいと思います。

前回の記事は、こちら!

https://zenn.dev/shiozumi/articles/088e64fee0d35d

git本家本元の情報はこちらから!

https://git-scm.com/book/ja/v2

そして今日の学習リポジトリは、前回同様ありません!

前回のリポジトリを、push したと思いますで、そこから、checkout してみましょう!
尚、今回から始めた人は、前回から始めるか、私のgithubのリポジトリで、お試しくださいね。

// まずは、適当にフォルダーを作成します。
// 第41回なので、temp0041 としました。
$ mkdir temp0041
$ cd temp0041

// それでは、git ⏎ してみます。(笑)
$ git

// たくさんメッセージが出てきますね。
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone     Clone a repository into a new directory
   init      Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add       Add file contents to the index
   mv        Move or rename a file, a directory, or a symlink
   restore   Restore working tree files
   rm        Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect    Use binary search to find the commit that introduced a bug
   diff      Show changes between commits, commit and working tree, etc
   grep      Print lines matching a pattern
   log       Show commit logs
   show      Show various types of objects
   status    Show the working tree status

grow, mark and tweak your common history
   branch    List, create, or delete branches
   commit    Record changes to the repository
   merge     Join two or more development histories together
   rebase    Reapply commits on top of another base tip
   reset     Reset current HEAD to the specified state
   switch    Switch branches
   tag       Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch     Download objects and refs from another repository
   pull      Fetch from and integrate with another repository or a local branch
   push      Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
See 'git help git' for an overview of the system.

メジャーなコマンドを一覧表示されますね!

  1. clone ・・・ここまで、何回か使いましたね。
  2. init ・・・これも定番の初期化で使いましたね。
  3. fetch ・・・未使用
  4. pull ・・・未使用
  5. push ・・・こちらも、前回は、-u を付けないでやってみましたね。

余談ですが、checkout は、実はリストに出て来ません。ここまで、何度か出てきましたが、v2.2x から、checkout の代替えとして、switch,restore が追加されたので、そちらを使うように勧めているのでしょう。

では早速、git clone を実行!

git clone https://github.com/<user-name>/<リポジトリ名>.git

  1. <user-name> は、みなさんのGitHubに合わせてください。
  2. <リポジトリ名> は、前回に作ったリポジトリ名ですね。

私の環境で試す場合は、以下のコマンドでOKです!
git clone https://github.com/shiozumi-makoto/test.git

git clone https://github.com/shiozumi-makoto/test.git
// 各自の環境に合わせて、実行してください!

$ ls
test
// GitHubのリモートリポジトリと同名で、
// フォルダーが作成されました!

$ ls -a test
.  ..  .git  README.md
// README.md の他、.gitも作成されていますね。

$ cd test
// test フォルダーに移動して、

$ git branch -a // <!-- ローカルとリモートの両方のリポジトリーを表示
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
  remotes/origin/sub

ここでの確認は、*「アスタリスク」が、mainブランチを選択していることと、remote/origin/main、remote/origin/sub ブランチがGitHubのリモートリポジトリーとして、あることですね。そして、ローカルには、subブランチがありません。-b <ブランチ名> で指定すると、他のブランチを取得可能です。[1]

git config -l | grep branch で、ローカルブランチと、リモートリポジトリの関連付けを検索してみましょう!

$ git config -l | grep branch
branch.main.remote=origin
branch.main.merge=refs/heads/main

前回学習したのを思い出してください。branch.main.<変数>の設定はありますが、branch.sub.<変数>の設定は、またありませんね。という状態です。

リモートのsubブランチをローカルに取得します!

git branch <ローカルブランチ名> origin/<リモートブランチ名>

  1. git branch sub origin/sub こちらで実行します。
  2. git checkout -b temp origin/sub も同様です。ブランチもsubに同時に切り替え!
  3. git checkout origin/sub 試しにブランチ名無しで、実行してみましょう!

git branch sub origin/sub

$ git branch sub origin/sub
Branch 'sub' set up to track remote branch 'sub' from 'origin'.
// リモートブランチsubから、ローカルブランチsubに取得!

$ git branch -vv
* main 6debbfa [origin/main] 2nd
  sub  0a276dc [origin/sub] 2nd

$ git config -l | grep branch.sub
branch.sub.remote=origin
branch.sub.merge=refs/heads/sub
// ローカルとリモートの関連付けも同時に行ってくれます。
// これで、ローカルsubブランチを、リモートsubブランチに、push 可能

sub ブランチが作成されて、ブランチは、mainのままですね。
git branch -vv で、[origin/sub] も認識されています。
git push origin sub で、push 可能です!

git checkout -b temp origin/sub

$ git checkout -b temp origin/sub
Branch 'temp' set up to track remote branch 'sub' from 'origin'.
Switched to a new branch 'temp'

$ git branch -vv
  main 6debbfa [origin/main] 2nd
  sub  0a276dc [origin/sub] 2nd
* temp 0a276dc [origin/sub] 2nd
// *アスタリスクマークが、temp になっていますね!

temp ブランチが作成されて、ブランチも、tempに切り替わりました。
ブランチ作成と同時にブランチの切り替えを行うのが、checkout です。

git checkout origin/sub

では、最後に禁断のブランチ名無しで、ブランチを取得します!(爆笑)

$ git checkout origin/sub
Note: switching to 'origin/sub'.

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

HEAD is now at 0a276dc 2nd

detached HEAD となりますが、git switch -c を案内されます。

ローカルのブランチ名を指定しなかったので、ブランチが存在しないので、HEADも設定できないようです。git switch -c は、ローカルブランチを作成して、ブランチ選択も切り替える。git checkout と同じ動作ですね。

git switch -c zzz で実行!

$ git branch -vv
* (HEAD detached at origin/sub) 0a276dc 2nd
  main                          6debbfa [origin/main] 2nd
  sub                           0a276dc [origin/sub] 2nd
  temp                          0a276dc [origin/sub] 2nd

$ git switch -c zzz
Switched to a new branch 'zzz'

$ git branch -vv
  main 6debbfa [origin/main] 2nd
  sub  0a276dc [origin/sub] 2nd
  temp 0a276dc [origin/sub] 2nd
* zzz  0a276dc 2nd
// (HEAD detached at origin/sub) が、zzz に割り当てられました。
// zzz ブランチには、[origin/sub] が設定されていないようですね。

では、最後に不要ブランチ、temp,zzzを削除!

$ git switch main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
// 一度、mainに切り替えてからの~

$ git branch -D temp zzz
Deleted branch temp (was 0a276dc).
Deleted branch zzz (was 0a276dc).
// temp zzz を同時に指定!

$ git branch -a
* main
  sub
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
  remotes/origin/sub

git branch -D temp zzz ブランチ名を複数して削除出来るようです。

最後に、README.mdを確認しましょう!

$ cat README.md
# git checkout main
// ブランチの違いが分かりやすいように、
// README.md の中身も変更してあります。

$ git switch sub
Switched to branch 'sub'
Your branch is up to date with 'origin/sub'.

$ cat README.md
# git checkout sub
// ブランチの違いが分かりやすいように、
// README.md の中身も変更してあります。

前回では、README.md の中身は、git checkout のままでした。
今回の学習で分かりやすくするように、中身をそれぞれ変更してあります。

git diff main sub ブランチを切り替えなくてもOK!

git diff <ブランチ名> <ブランチ名> でブランチ同士の差分を調べられます!

$ git diff main sub
diff --git a/README.md b/README.md
index bde6a99..f66e628 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# git checkout main
+# git checkout sub

最後の最後! git push origin sub

$ git config -l | grep branch.sub
branch.sub.remote=origin
branch.sub.merge=refs/heads/sub
// 念のため、最終確認して置きます!

$ git push origin sub // <!-- -u オプションなしでOK!
Username for 'https://github.com': shiozumi-makoto
Password for 'https://shiozumi-makoto@github.com':
Everything up-to-date // <!-- 特に変更していないので!

今回のまとめ

  1. git branch <ローカルブランチ名> <リモートブランチ名> で取得可能!
  2. branch.sub.remote=origin, branch.sub.merge=refs/heads/sub も同時に設定!
  3. 以後、git push origin sub で、push可能。-u オプションなしでOK!

さあ、いかがでしょうか? checkout を使用しなくても、branch,switch で操作可能です。また、git switch -c を使えば、git checkout と同じ処理になるということで、いよいよ、checkoutは、不要ってことになりそうです。まあ、git「⏎改行」では、checkout も案内されませんから・・・(^▽^;) そういう意味なんだと思います。

それでは、今回はここまで、お疲れ様でした!

https://zenn.dev/shiozumi/articles/ff9c5388f2068a
https://twitter.com/esmile2013

良ければ、本家のリモートブランチをどうぞ!

https://git-scm.com/book/ja/v2/Git-のブランチ機能-リモートブランチ
脚注
  1. git clone https://github.com/shiozumi-makoto/test.git -b sub と指定すると、main ではなく、sub ブランチを取得できます! ↩︎