未だに、gitの操作をコマンドラインでうまくやれない。。。
GUIでやることが多いのだが、クラウド上で操作することもあるので、もうちょっと慣れておかないといかん。
まずcloneだが、決まったbranchを取ってきたいことがある。
その場合、-bを付ければよいことはわかった。
ただ、これでbranch名を打ち間違えたりして、実は違うものを(例えばmaster)を取ってきて、勝手に自分が思っているbranch名を作成してしまった、という現象が起きたりしないだろうか?
試そう。
ここを使わせてもらおう。
https://github.com/bitcoin/bitcoin
branchはこういう状況のようだ。
まずは、存在しないbranch名でcloneしてみよう。
$ git clone -b hehehe https://github.com/bitcoin/bitcoin.git
Cloning into 'bitcoin'...
fatal: Remote branch hehehe not found in upstream origin
おお、失敗してくれた。
念のため、「0.13.1」や「0.13.」なども試したが、失敗してくれる。
では、存在する名前「0.13」でcloneして、branchを確認しよう。
$ git branch -a
* 0.13
remotes/origin/0.10
remotes/origin/0.11
remotes/origin/0.12
remotes/origin/0.13
remotes/origin/0.14
remotes/origin/0.8
remotes/origin/0.9
remotes/origin/HEAD -> origin/master
remotes/origin/master
うーん、0.13が現在のbranch名というのはわかるけど、origin/0.13と同じかどうか不安だ。
もし、ここでcheckoutさせて、origin/0.14を「0.15」という名前にできるだろうか?
$ git checkout -b 0.15 origin/0.14
Branch 0.15 set up to track remote branch 0.14 from origin.
Switched to a new branch '0.15'
できそう。。。
$ git branch -a
0.13
* 0.15
remotes/origin/0.10
remotes/origin/0.11
remotes/origin/0.12
remotes/origin/0.13
remotes/origin/0.14
remotes/origin/0.8
remotes/origin/0.9
remotes/origin/HEAD -> origin/master
remotes/origin/master
うーん、これではcheckoutしたbranchと、ローカルで付けたbranch名の対応がわからんな。
しかし、Git Extensionsで見ると、ちゃんとわかっているようだ。
これか。
追跡ブランチ (tracking branch) というブランチが何なのか調べた - snowlongの日記
$ git branch -vv
0.13 59c37ae [origin/0.13] Uses built-in byte swap if available (Apple) and if bswap_XX is undefined.
* 0.15 2afefea [origin/0.14] boost: remove iostreams includes
今のbranchはアスタリスクがついている2行目の方だから、これで「0.15は、実はorigin/0.14と関連付けられていますよ」という情報が読み取れるということになるか。
helpには、upstream branchの名前を出力する、と書いてあった。
あれ、tracking branchじゃないの?
ローカルリポジトリから見ると、上流のbranch、ということか??
Git で「追跡ブランチ」って言うのやめましょう - Qiita
Gitのリモートブランチと追跡ブランチは違うよ
過去の経緯などもあり、混乱の元になっているようだ。。。
あまりgitを使っていないからかもしれんが、cloneするときと同じく、同じbranch名でしかcheckoutできないようにしておいた方がよかったんじゃなかろうか。
あるいは、オプションを指定しなければ同じbranch名でcheckoutされる、とか。
いや、もしかしたら、普通はそうするとか?
$ git checkout 0.11
Branch 0.11 set up to track remote branch 0.11 from origin.
Switched to a new branch '0.11'
$ git branch -vv
* 0.11 0cd4fb6 [origin/0.11] qt: Final translation update on 0.11 branch
0.13 59c37ae [origin/0.13] Uses built-in byte swap if available (Apple) and if bswap_XX is undefined.
なんだよー、-b付けずにremoteと同じ名前を指定したら、自動的にupstreamも同じ名前のものになってるじゃないか。
では、checkoutでremoteに存在しない名前を指定したらどうなる?
$ git checkout 0.17
error: pathspec '0.17' did not match any file(s) known to git.
エラーなんだ。
私の場合は違うbranch名を付けたいわけでもないから、普段は-bを使わずにやったほうがよいかも。
ついでに、気になっていた「remotes/origin/HEAD -> origin/master」も調べよう。
いや、さっきの追跡リポジトリも、branch -aみたいなコマンドで、
$ git branch -??
* 0.15 -> [origin/0.14]
みたいに出てくるのだと思っていたのだよ。
今は[origin/0.14]にいるのだから、HEADも0.14になるのかと思ったが、そうではないのか。
むむ、revertするときにHEADを使ってたけど、別branchで使っているとまずいんだろうか?
こちらによると、HEADは「現在作業中のブランチを指す」となっている。
3.1 Git のブランチ機能 - ブランチとは
それなら、思っているのと同じだ。
でも、それだったらbranch -aで出てくるのも変わっていないと変な気がするが。。。
もう一度、出力を確認しよう。
$ git branch -a
0.13
* 0.15
remotes/origin/0.10
remotes/origin/0.11
remotes/origin/0.12
remotes/origin/0.13
remotes/origin/0.14
remotes/origin/0.8
remotes/origin/0.9
remotes/origin/HEAD -> origin/master
remotes/origin/master
ああ、自分のHEADじゃなくて、origin/HEADだ。
自分のところのgithubで確認してみよう。
まず、普通にcloneしてbranchを見る。
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/opensdk
githubの設定画面で、Default branchをorigin/opensdkに変更。
そして、あらたにcloneしてbranchを見る。
$ git branch -a
* opensdk
remotes/origin/HEAD -> origin/opensdk
remotes/origin/master
remotes/origin/opensdk
おお、変わった。
普通のHEADは現在のリポジトリの先頭だけど、remote/HEADはremoteがデフォルトにしているリポジトリということで良いのかな。
ただ、デフォルトを変更してからローカルにfetchしても変わらなかったのだ。
おまけ。
gitで~/.ssh/id_rsaではないファイルを指定したい場合で、コマンドラインだけで済ませたいなら、ssh-agentを使うとよいらしい。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。