2017/02/19

[git]間違ったbranchをcloneしていないか心配

未だに、gitの操作をコマンドラインでうまくやれない。。。
GUIでやることが多いのだが、クラウド上で操作することもあるので、もうちょっと慣れておかないといかん。

 

まずcloneだが、決まったbranchを取ってきたいことがある。
その場合、-bを付ければよいことはわかった。
ただ、これでbranch名を打ち間違えたりして、実は違うものを(例えばmaster)を取ってきて、勝手に自分が思っているbranch名を作成してしまった、という現象が起きたりしないだろうか?

試そう。


ここを使わせてもらおう。
https://github.com/bitcoin/bitcoin

branchはこういう状況のようだ。
image

まずは、存在しない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で見ると、ちゃんとわかっているようだ。

image

 

これか。
追跡ブランチ (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で確認してみよう。

https://github.com/hirokuma/esp8266_httpget

まず、普通に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を使うとよいらしい。

git - Specify private SSH-key to use when executing shell command with or without Ruby? - Stack Overflow

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。