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 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分支可能会“落后”远程的分支;  

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

场景:当前分支已经有关联分支,并且关联分支与当前分支同名;
作用:将当前分支代码同步到远程同名分支;

首先从远程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

git checkout -b dev_zhangcz origin/dev   #在本地创建一个 dev_zhangcz 分支,并拉去远端的origin/dev

 这样我们本地就有了一个和远程"dev"相关联的分支"dev_zhangcz",此时我们执行git push会怎么样呢?

 

zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_zhangcz)
$ git push
fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:dev

To push to the branch of the same name on the remote, use

    git push origin dev_zhangcz

To choose either option permanently, see push.default in 'git help config'.

报错的大意思就是:你当前分支的关联分支(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:推送本地和远程都存在的同名分支。

  


链接:https://www.jianshu.com/p/1abad73f8161
来源:简书

 

posted @ 2019-05-20 12:52  离人怎挽_wdj  阅读(2108)  评论(0编辑  收藏  举报