Gitコマンド入門::checkout(branch,switch)「第四十一回」
みなさんこんにちは! 今回は前回に引き続き、checkout,branchなど、ブランチ関連を学習しながら、GitHubへの操作コマンドも併せて学習して行きましょう! まあ~、簡単にポイントをいうと、checkout コマンドなどは、オプションスイッチを付けることによって、ブランチの切り替えと同時に、その他の処理も行うので、それを分解していくことで理解を深めるといったやり方ですね。そして、その状態を確認するコマンドも含めて進めて行きたいと思います。
前回の記事は、こちら!
git本家本元の情報はこちらから!
そして今日の学習リポジトリは、前回同様ありません!
前回のリポジトリを、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.
メジャーなコマンドを一覧表示されますね!
- clone ・・・ここまで、何回か使いましたね。
- init ・・・これも定番の初期化で使いましたね。
- fetch ・・・未使用
- pull ・・・未使用
- push ・・・こちらも、前回は、-u を付けないでやってみましたね。
では早速、git clone を実行!
git clone https://github.com/<user-name>/<リポジトリ名>.git
- <user-name> は、みなさんのGitHubに合わせてください。
- <リポジトリ名> は、前回に作ったリポジトリ名ですね。
私の環境で試す場合は、以下のコマンドで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/<リモートブランチ名>
- git branch sub origin/sub こちらで実行します。
- git checkout -b temp origin/sub も同様です。ブランチもsubに同時に切り替え!
- 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 // <!-- 特に変更していないので!
今回のまとめ
- git branch <ローカルブランチ名> <リモートブランチ名> で取得可能!
- branch.sub.remote=origin, branch.sub.merge=refs/heads/sub も同時に設定!
- 以後、git push origin sub で、push可能。-u オプションなしでOK!
さあ、いかがでしょうか? checkout を使用しなくても、branch,switch で操作可能です。また、git switch -c を使えば、git checkout と同じ処理になるということで、いよいよ、checkoutは、不要ってことになりそうです。まあ、git「⏎改行」では、checkout も案内されませんから・・・(^▽^;) そういう意味なんだと思います。
それでは、今回はここまで、お疲れ様でした!
良ければ、本家のリモートブランチをどうぞ!
-
git clone https://github.com/shiozumi-makoto/test.git -b sub
と指定すると、main ではなく、sub ブランチを取得できます! ↩︎
Discussion