他のレポジトリにある作業中でないブランチをコピーする

AliceとBobが居て,gitで協業しようとしている.

  1. Aliceは,$ALICE_WORKING/reposというディレクトリにレポジトリがあり,masterとcur_workingというブランチがあって,cur_workingというブランチで作業中(current working branchとでも言えばいいのかな?)である.
  2. Bobは,これから$BOB_WOKINGというディレクトリにAliceのレポジトリをコピーして作業を行うつもり.

で,このときBobがAliceのmasterブランチをコピーするにはどうするか?

ちなみに:

$ whoami
Bob
$ git clone $ALICE_WORKING/repos
Initialized empty Git repository in $BOB_WORKING/repos/.git
$ cd repos
$ git branch
* cur_working

となります.

さて…
自分が持つブランチには,まさに自分の作業場である「ローカルのブランチ」と「リモート追跡用ブランチ」があるそうです(らしいですよ).

「git branch」と打つとローカルのブランチの一覧が表示され,「git branch -r」と打つとリモート追跡用ブランチの一覧が表示されます:

$ git branch -r
  origin/HEAD
  origin/master
  origin/cur_working

ちょっとこいつにcheckoutしてみましょう:

$ git checkout origin/master
Note: moving to "origin/master" which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at …略
$ git branch
* (no branch)
  cur_working

ローカルで付ける名前を考えて(の部分)「git checkout -b 」を実行すればよいらしい.

$ git checkout -b master
Switched to a new branch "master"
$ git branch
* master
  cur_working

「git log」を見ると,オリジナルのものと同じ内容だった.
勘と表示されるメッセージでやってたけど,コピーはこれでOKのようだ.

git fetchとか

これまでの話は,おそらく「リモート追跡用ブランチにコピーしたい対象のブランチのイメージ(って言えばいいのかな?)が入っていた」からできたことだと思います.

ではイメージが無かったら?

「git fetch」を使うらしい.

$ git fetch origin refs/heads/master
From $ALICE_WORKING/repos
 * branch            master     -> FETCH_HEAD

と「git fetch」を打つと,自分自身の「リモート追跡ブランチ」に「originにあるmasterブランチ」が格納されるそうです.

さっぱりですね,「refs/heads」って何でしょうか?
manにあるのこと?ブランチの参照名っぽいですね.manをもっとよく読めってやつでしょうか?普通に「origin/master」でいい気がしますが…
一応,適当に斜めに読むだけでもなんとか着いて行けている感じ…

gitは便利なんだろうけど,ちょっと癖がありますね…

注意

面倒なので適当に調べて書いています.間違っているかもしれないので注意.