git的push的默认行为

基础

push.default

在git的全局配置中,有一个push.default属性,其决定了git push操作的默认行为。在Git 2.0之前,这个属性的默认被设为'matching',2.0之后则被更改为了'simple'。

我们可以通过git version确定当前的git版本(如果小于2.0,更新是个更好的选择),通过git config --global push.default 'option'改变push.default的默认行为(或者也可直接编辑~/.gitconfig文件)。

push.default 有以下几个可选值:
nothing, current, tracking/upstream, simple, matching

其用途分别为:

nothing - push操作无效,除非显式指定远程分支,例如git push origin develop。

current - push当前分支到远程同名分支,如果远程同名分支不存在则自动创建同名分支。

tracking/upstream - push当前分支到它的upstream分支上(这一项其实用于经常从本地分支push/pull到同一远程仓库的情景,这种模式叫做central workflow)。

simple - simple和upstream是相似的,只有一点不同,simple必须保证本地分支和它的远程upstream分支同名,否则会拒绝push操作。

matching - push所有本地和远程两端都存在的同名分支。

upstream & downstream

git中存在upstream和downstream,简言之,当我们把仓库A中某分支x的代码push到仓库B分支y,此时仓库B的这个分支y就叫做A中x分支的upstream,而x则被称作y的downstream,这是一个相对关系,每一个本地分支都相对地可以有一个远程的upstream分支(注意这个upstream分支可以不同名,但通常我们都会使用同名分支作为upstream)。

初次提交本地分支,例如git push origin develop
操作,并不会定义当前本地分支的upstream分支,我们可以通过git push --set-upstream origin develop
,关联本地develop分支的upstream分支,另一个更为简洁的方式是初次push时,加入-u参数,例如git push -u origin develop
,这个操作在push的同时会指定当前分支的upstream。
注意push.default = current可以在远程同名分支不存在的情况下自动创建同名分支,有些时候这也是个极其方便的模式,比如初次push你可以直接输入 git push 而不必显示指定远程分支。

pull的默认行为

在执行git pull的时候,实际上是做了git fetch + git merge两个操作:

  • fetch操作将会更新本地仓库的remote tracking,也就是refs/remotes中的代码,并不会对refs/heads中本地当前的代码造成影响。

  • 在merge时,如果没有指定upstream,git会访问.git/config文件中当前分支(develop)merge的默认配置,例如:

[branch "develop"]
    remote = origin
    merge = refs/heads/develop // [1]为什么不是refs/remotes/develop?

或者通过命令行直接设置:

git config branch.develop.merge refs/heads/develop

如果指定了upstream分支,则会忽略config中的merge默认配置。


实例1

假设本地分支是master
远程分支是origin/dev

如果需要让git push的行为等效于git push origin master:dev

第一步设置push的默认行为是'tracking':

git config --global push.default 'tracking'

第二部设置本地master分支的upstream:

git branch --set-upstream master origin/dev

你可能感兴趣的:(git的push的默认行为)