## git push 推送你的新分支与数据到某个远端仓库
想要与他人分享你牛鼻的提交,你需要将改动推送到远端仓库。 执行 `git push [alias] [branch]`,就会将你的 [branch] 分支推送成为 [alias] 远端上的 [branch] 分支。 让我们试试推送我们的主分支到先前添加的“github”远端仓库上去。
~~~
$ git push github master
Counting objects: 25, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (25/25), done.
Writing objects: 100% (25/25), 2.43 KiB, done.
Total 25 (delta 4), reused 0 (delta 0)
To git@github.com:schacon/hw.git
* [new branch] master -> master
~~~
挺简单。现在如果有人从该仓库克隆,他会得到我提交的完完全全的一份历史记录了。
如果有个像之前创建的“erlang”分支那样的主题分支,想只分享这个,该怎么办呢?你可以相应的只推送该分支。
~~~
$ git push github erlang
Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 652 bytes, done.
Total 6 (delta 1), reused 0 (delta 0)
To git@github.com:schacon/hw.git
* [new branch] erlang -> erlang
~~~
现在当人们从该仓库克隆时,他们就会得到一个“erlang”分支以查阅、合并。 用这种方式,你可以推送任何分支到任何你有写权限的仓库。 如果你的分支已经在该仓库中了,它会试着去更新,如果它不再,Git 会把它加上。
最后一个当你推送到远端分支时会碰到的主要问题是,其他人在此期间也推送了的情况。 如果你和另一个开发者同时克隆了,又都有提交,那么当她推送后你也想推送时,默认情况下 Git 不会让你覆盖她的改动。 相反的,它会在你试图推送的分支上执行 `git log`,确定它能够在你的推送分支的历史记录中看到服务器分支的当前进度。 如果它在在你的历史记录中看不到,它就会下结论说你过时了,并打回你的推送。 你需要正式提取、合并,然后再次推送 —— 以确定你把她的改动也考虑在内了。
当你试图推送到某个以被更新的远端分支时,会出现下面这种情况:
~~~
$ git push github master
To git@github.com:schacon/hw.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:schacon/hw.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again. See the 'Note about
fast-forwards' section of 'git push --help' for details.
~~~
你可以修正这个问题。执行 `git fetch github; git merge github/master`,然后再推送
> **简而言之** 执行 `git push [alias] [branch]` 将你的本地改动推送到远端仓库。 如果可以的话,它会依据你的 [branch] 的样子,推送到远端的 [branch] 去。 如果在你上次提取、合并之后,另有人推送了,Git 服务器会拒绝你的推送,知道你是最新的为止。