## git push <远程主机名> <本地分支名>:<远程分支名>
```
git push origin master
```
如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
```
git push origin
```
如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
```
git push
```
如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名
## git push 的其他命令
这几个常见的用法已足以满足我们日常开发的使用了,还有几个扩展的用法,如下:
```
git push -u origin master
```
如果当前分支与多个主机存在**追踪关系**,则可以使用 **-u** 参数指定一个默认主机,这样后面就可以不加任何参数使用git push,不带任何参数的git push,默认只推送当前分支
```
git push --force origin branch
```
git push的时候需要本地先git pull更新到跟服务器版本一致,如果本地版本库比远程服务器上的低,那么一般会提示你git pull更新,如果一定要提交,那么可以使用这个命令。
> 上面命令使用`--force`选项,结果导致远程主机上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用`--force`选项。这个命令应该谨慎使用,通常用在开发功能分支rebase线上master之后,功能开发分支的commmit基点可能发生改变,需要-f强推到 功能开发分支
#### 那么`git push --force`命令有什么安全问题?
`--force`会使用本地分支的提交覆盖远端推送分支的提交。也就是说,如果其他人在相同的分支推送了新的提交,你的这一举动将“删除”他的那些提交!就算在强制推送之前先`fetch`并且`merge`或`rebase`了也是不安全的,因为这些操作到推送之间依然存在时间差,别人的提交可能发生在这个时间差之内。
#### `--force-with-lease`将解决这种安全问题
```
git push --force-with-lease origin branch
```
使用了`--force-with-lease`参数之后,上面那种安全问题就没有那么危险了。
使用此参数推送,如果远端有其他人推送了新的提交,那么推送将被拒绝,这种拒绝和没有加`--force`参数时的拒绝是一样的。
## 创建本地分支和远程分支的关联关系
切换分支到 mybranch1
设置本地分支和远程分支的关联关系,并推送本地分支内容到远端:
```
git push -u origin mybranch1
相当于
git push --set-upstream origin mybranch1
```
或者只设置本地分支和远程分支的关联关系
```
git branch --set-upstream-to=origin/mybranch1 mybranch1
```
这样 git push 直接推送相当执行 git push origin XXX