未来のいつか/hyoshiokの日記 このページをアンテナに追加 RSSフィード Twitter

2013-05-05

ローカルで作ったリポジトリをgithubに初めてpushする方法

例えば以下のようにローカルgit管理していて、ふとgithubあたりで公開したくなったとする。はじめからgithubレポジトリを持っていた場合は、それを $ git clone して、ローカルごにょごにょして $ git push すればいいのだけど、その順番が逆の場合

$ git init
$ git add .
$ git commit -m "initial commit"
...

ここで、あー、githubにpushしたいなーとふと思う。

おもむろにgithubにsign inしてrepositoryをnewする。仮にユーザ名がuser-nameリポジトリがrepositoryというのを作ったすると、ローカルからのpushは下記のような感じになる。

$ git remote add origin git@github.com:user-name/repository

最初にremoteのリポジトリを指定する。

これでpushすればいいのだけど、先にローカルレポジトリができているので、そのままpushしようとすると下記のように言われる。

$ git push origin master
Warning: Permanently added the RSA host key for IP address 'xxx.xxx.xxx.xxx' to the list of known hosts.
Identity added: /Users/user-name/.ssh/id_rsa (/Users/user-name/.ssh/id_rsa)
To git@github.com:user-name/repository
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:user-name/repository'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

fast-forward updateじゃないのでrejectされちゃう

これは、remoteのレポジトリーをfetchしてmergeしてpushすればよい。

$ git fetch
warning: no common commits
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From github.com:user-name/repository
 * [new branch]      master     -> origin/master
$ git status
# On branch master
nothing to commit (working directory clean)
$ git merge origin/master
Merge made by the 'recursive' strategy.
 README.md |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 README.md
$ git status
# On branch master
nothing to commit (working directory clean)
$ git push
Counting objects: 248, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (229/229), done.
Writing objects: 100% (247/247), 85.98 KiB, done.
Total 247 (delta 86), reused 0 (delta 0)
To git@github.com:user-name/repository
   1211ccd..18f61bd  master -> master

というような感じでmergeがpushできた。mergeした時にコンフリクトしたらば、それは手動で解決する。

ローカルごにょごにょしていて、会社のレポジトリにpushして社内で公開するような時にも同様にできると思う。

ssh-keyなどは事前に登録しておいてください。

takkan_mtakkan_m 2013/05/05 23:53 merge が必要だったのは、リポジトリを作成する際のオプションで README ファイルを作成するオプションがオンになっていたからだと思います。
README や .gitignore を作成するオプションをオフにして作成すれば、git remote add 後、そのまま push できるはずです。

hyoshiokhyoshiok 2013/05/06 08:44 id:takkan_m さん、コメントありがとうございます。その通りですね。remoteがさらの状態だったらばいけたと思います。