未来のいつか/hyoshiokの日記

hyoshiokの日々思うことをあれやこれや

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

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

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

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

おもむろにgithubsign 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などは事前に登録しておいてください。