rcmdnk's blog

Gitによるバージョン管理

まだ余りGitで複雑な事をしてないこともあって曖昧なまま 使ってる点が多くて駄目ですが、 新しく作ったブランチをリモートに送る際に ちょっと勘違いしてた事があったのでその辺のまとめ。

リモートにブランチを送る

新しいブランチを送るには1

$ git push <remote repository> <branch>

でリモートレポジトリに遅れてGitHubとかならウェブから見れば新しい ブランチが確認できます。

$ git clone [email protected]:rcmdnk/sentaku.git
...
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/install
  remotes/origin/master
$ git checkout -b new_br
Switched to a new branch 'new_br'
$ git branch -a
  master
* new_br
  remotes/origin/HEAD -> origin/master
  remotes/origin/install
  remotes/origin/master
$ git push origin new_br
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:rcmdnk/sentaku.git
 * [new branch]      new_br -> new_br
$ git branch -a
  master
* new_br
  remotes/origin/HEAD -> origin/master
  remotes/origin/install
  remotes/origin/master
  remotes/origin/new_br
$

こんな感じでoriginnew_brというブランチを送ることが出来ました。

pullしてみる

さて、この状態で、new_brの中で編集してcommitpushすると リモートのorigin/new_brにも正しく反映されます。

普段、この様なブランチはちょっと作ってmastermergeしたら消す、 的な事をしてたので知らなかったんですが、 ここでpullをしてみると

$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> new_br

$

という様に、リモートにつながってません。 pushが出来るので当然つながってるもんだと思ってましたが 確かに.git/configを見てみるとない模様。

リモートとの接続を調べる

ここでリモートとどの様に繋がってる見るにはremote showコマンドを使います。

テストのために、一度他で同じレポジトリをチェックアウトして new_br_2というブランチを別途追加してあります。

上の続きでbranch -aしてみると

$ git branch -a
  master
* new_br
  remotes/origin/HEAD -> origin/master
  remotes/origin/install
  remotes/origin/master

となり、new_br_2は見えてない状態です。

ここでremote showしてみると

$ git remote show origin
* remote origin
  Fetch URL: [email protected]:rcmdnk/sentaku.git
  Push  URL: [email protected]:rcmdnk/sentaku.git
  HEAD branch: master
  Remote branches:
    install  tracked
    master   tracked
    new_br   tracked
    new_br_2 new (next fetch will store in remotes/origin)
  Local branch configured for 'git pull':
    master merges with remote master
  Local refs configured for 'git push':
    master pushes to master (up to date)
    new_br pushes to new_br (up to date)
$

こんな感じです。new_br_2に関してはまだローカルでトラックされてません。 (一度fetchpullをすれば登録されます。)

その下を見るとgit pull用に設定されているのがmasterだけになってることが 分かります。

その下に行くとgit pushに関してはnew_brも登録されてます。

Gitではダウンロードする側とアップロードする側を別途管理してるため、 上のgit pushだけだとアップロード用だけに登録される、ということです。

remote showの他にも、branch -vvでローカルブランチのpull的な繋がりを見ることも出来ます。

$ git branch -vv
master 6c4e88e [origin/master] added -r option
* new_br 6c4e88e added -r option

となって、masterの方はorigin/masterとつながってますが、 new_brの方はどこともつながってないことが分かります。

pullにも登録する

ここでpullにも登録するには上のメッセージにもあるように

$ git branch --set-upstream-to=origin/new_br new_br

もしくは

$ git branch -u origin/new_br new_br

とします。最後のブランチ名は現在居るブランチを登録するときには省けます。

$ git branch -u origin/new_br
Branch new_br set up to track remote branch new_br from origin.
$ git remote show origin
...
Local branches configured for 'git pull':
master merges with remote master
new_br merges with remote new_br
...

OK。

pushするときに登録する

この様に後から登録しないでも、pushするときに登録することが出来ます。

$ git push -u origin new_br

と、-uオプションを付けるだけ。

なので、この辺を理解出来たらリモートにブランチを送る時は push -uで送っておけばOK、ということです。

Sponsored Links
Sponsored Links

« 二つのディレクトリのdiffをvimで順にチェック/較正していく Octorpessについてのここまでのまとめ »

}