前言
上一次我们详细讲解了git pull
的三种使用方式,也介绍了什么是upstream(关联分支),这次我们来看看git push
的使用;
在使用push时,我们要特别注意分支的名称和”关联分支"对于操作的影响;
1.git push
2.git push origin <remote_branch>
3.git push origin <local_branch>:<remote_branch>
测试起始环境:
远程仓库有两个分支:master和dev
本地仓库由一个分支:master
注:本次只使用dev分支进行演示
zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (master)
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
1.git push
场景:当前分支已经有关联分支,并且关联分支与当前分支同名;
作用:将当前分支代码同步到远程同名分支;
什么是关联分支:点击我
首先从远程dev分支检出一个不同名的分支dev_zhangcz:
zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (master)
$ git checkout -b dev_zhangcz origin/dev
Switched to a new branch 'dev_zhangcz'
Branch dev_zhangcz set up to track remote branch dev from origin.
zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_zhangcz)
$ git branch
* dev_zhangcz
master
这样我们本地就有了一个和远程"dev"相关联的分支"dev_zhangcz",此时我们执行git push会怎么样呢?
zhangchangzhi
报错的大意思就是:你当前分支的关联分支(upstream branch)与你分支的名字不匹配(not match);
我们在使用git branch -vv
查看一下dev_zhangcz分支的关联分支:
zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_zhangcz)
$ git branch -vv
* dev_zhangcz 3b7001a [origin/dev] cm
master 941758f [origin/master] master new
确实dev_zhangcz关联的分支(dev)名字和它不一样;git给出的解决方案
1.push到HEAD分支;
2.push到远程同名的分支(新建);
通常情况下,我们选择方案2,但如果你就是想要push到origin/dev分支,也可以选择重命名当前分支,然后重新执行git push
;或者使用git push origin dev
zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_zhangcz)
$ git branch -m dev_zhangcz dev
zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev)
$ git push
Everything up-to-date
结论:当使用
git push
执行默认推送时,本地分支需与"关联分支"同名才可以;
深入push.default
在git的全局配置中,有一个push.default属性,其决定了git push
操作的默认行为。
push.default 有以下几个可选值: nothing, current, upstream, simple, matching
- nothing: 直接push会出错,需要显式的指出推送的远程分支,例如:git push origin <remote_branch>;
- current: 推送时只会推送当前所在的分支到远程同名分支,如果远程分支不存在相应的同名分支,则创建该分支;
- upstream: 推送当前分支到它的upstream分支上,这个模式只适用于推送到与拉取数据相同的仓库(比如central workflow);
- simple(默认): simple和upstream是相似的,只有一点不同,simple必须保证本地分支和它的远程 upstream分支同名,否则会拒绝push操作。
- matching:推送本地和远程都存在的同名分支。
什么是upstream:点击我
在git 2.0中,simple是push.default的默认值配置项(2.0以前的默认配置项是matching),因为该选项对于新手来说是最安全的。
2.git push origin <local_branch>
场景:同步指定分支(非当前分支)到远程分支,如果是当前分支则<local_branch>可以省略
作用:"同步"指定的本地分支到远程关联同名分支;
介绍git push
时,对这种情况作了说明,当你想要把非当前分支推送到其关联的远程分支,可以使用这种方法。
zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev)
$ git push origin dev_zcz
上述示例,把本地的dev_zcz分支,同步到远端的dev_zcz分支;
特别注意:
1.如果本地dev_zcz的关联分支与dev_zcz名称不一样,则会在远程新建一个dev_zcz分支;
2.新建的远程dev_zcz分支并不会与本地的dev_zcz分支建立关联关系;(本地的dev_zcz还关联的是其检出时的那个分支)
3.如果想在检出时建立分支,需要使用git push -u dev_zcz
这样同步时就会关联新创建的远程分支;
3.git push origin <local_branch>:<remote_branch>
场景:将本地分支推送到远程不同名的分支;
作用:将指定的本地分支推送到指定的远程分支;(这两个分支并没有建立关联关系,且可以不同名)
无论是 git push
还是git push local_branch
,都需要本地分支与远程分支同名,当需要将本地分支推送到远程不同名分支,则需要使用这种方式;
zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev)
$ git push origin dev:dev_zcz
同步本地的dev和远端的master分支,这样同步后本地的master分支可能会“落后”远程的分支;