リモートリポジトリの登録とデフォルトリモートブランチの設定

はじめに
---------

リモートリポジトリ(Git Hub)を登録および、デフォルトリモートブランチの
設定について解説しています。


リモートリポジトリの登録
-------------------------

事前にGit Hub側でリポジトリを作成しておき、以降の作業は
手元のローカルリポジトリ上で作業を進めます。

```bash
# git blanch -l
* master
  
# touch README.md

# git add README.md
# git commit -m "First commit"
```

この時点での".git/config"は下記の状態です

```bash
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
```

手元の開発環境のリモートリポジトリとして、Git Hub側のリポジトリを登録します。
ここでは、リモートリポジトリ名を**original**とします。

```bash
$ git remote add original git@github.com:hoge/test.git
```

この時点での".git/config"は下記の状態です。

```bash
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "original"] <-- originalという名前のリモートリポジトリが登録された
        url = git@github.com:hoge/test.git
        fetch = +refs/heads/*:refs/remotes/original/*
```

デフォルトリモートブランチの設定
----------------------------------

`git push`コマンド実行時に`-u`オプションを指定することで
ローカルリポジトリのブランチとリモートリポジトのブランチの対応付けが行われます。
これにより、2回目以降はpullの場合は`git pull`、pushの場合は`git push`コマンド
とするだけでOKになります。


```bash
# git blanch -l
* master
  
$ git push -u original master
Enter passphrase for key '/home/hoge/.ssh/id_rsa': 
Counting objects: 3, done.
Writing objects: 100% (3/3), 257 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:hoge/test.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from original.
```

この時点での".git/config"は下記の状態です

```bash
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "original"]
        url = git@github.com:hoge/test.git
        fetch = +refs/heads/*:refs/remotes/original/*
[branch "master"] <-- これが追加された
        remote = original
        merge = refs/heads/master
```

他ブランチの設定
--------------------

先ほどの例では**masterブランチ**上でデフォルトリモートブランチを
作成しましたが、今度はローカルリポジトリ上で新たに**new_branch**を
作成し、デフォルトリモートブランチを作成します。

```bash
$ git checkout -b new_branch
Switched to a new branch 'new_branch'

$ git branch
  master
* new_branch

$ git push -u original new_branch
Enter passphrase for key '/home/hoge/.ssh/id_rsa': 
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:hoge/test.git
 * [new branch]      new_branch -> new_branch
Branch new_branch set up to track remote branch new_branch from original.

$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "original"]
        url = git@github.com:hoge/test.git
        fetch = +refs/heads/*:refs/remotes/original/*
[branch "master"]
        remote = original
        merge = refs/heads/master
[branch "new_branch"] <--新しく追加されている
        remote = original
        merge = refs/heads/new_branch
```

ローカルリポジトリとリモートリポジトリのブランチ名が異なる場合の登録
----------------------------------------------------------------------

これまでの説明ではローカルリポジトリとリモートリポジトリのブランチ名が
同じであることを前提にして説明していました。

ローカルリポジトリとリモートリポジトリでブランチ名が異なる場合は下記のように
エラーになってしまいました。

```bash
$ git checkout -b topic
$ touch topic_file1
$ git add topic_file1
$ git commit -m "add topic_file1"

$ git push -u original cipot
Enter passphrase for key '/home/hoge/.ssh/id_rsa': 
error: src refspec cipot does not match any.
error: failed to push some refs to 'git@github.com:seak0503/test.git'
```

通常は、ローカルリポジトリをリモートに反映する場合は
`git push origin hoge`のようにしていますが、このコマンドは省略形であり
完全系は`git push origin hoge:hoge`になります。

`hoge:hoge`の部分は`ローカルリポジトリのブランチ:リモートリポジトリのブランチ`を示します。

[参考資料](/files/20140427/git_push_command.pdf)

例えば下記のように実施すると上手くいくようです。

```bash
$ git push -u original topic:cipot
Enter passphrase for key '/home/hoge/.ssh/id_rsa': 
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:seak0503/test.git
 * [new branch]      topic -> cipot
Branch topic set up to track remote branch cipot from original.
```

この時点での".git/config"は下記の状態です

```bash
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "original"]
        url = git@github.com:hoge/test.git
        fetch = +refs/heads/*:refs/remotes/original/*
[branch "master"]
        remote = original
        merge = refs/heads/master
[branch "new_branch"]
        remote = original
        merge = refs/heads/new_branch
[branch "topic"] <-- これが追加された
        remote = original
        merge = refs/heads/cipot
```