Git

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

More than 3 years have passed since last update.

はじめに

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

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

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

# git blanch -l
* master

# touch README.md

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

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

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

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

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

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

[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になります。

# 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"は下記の状態です

[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
作成し、デフォルトリモートブランチを作成します。

$ 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

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

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

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

$ 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の部分はローカルリポジトリのブランチ:リモートリポジトリのブランチを示します。

参考資料

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

$ 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"は下記の状態です

[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