git 实践(二) push的使用

前言

上一次我们详细讲解了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分支可能会“落后”远程的分支;



原文地址:https://www.cnblogs.com/jianxian/p/12650942.html