写于: 2016/2/19
前记:有些时候在推送分支到远程仓库的时候,可以只打git push ,而有些时候则需要git push <repository> <本地分支>
那么到底这个命令在什么时候简写,什么时候需要写全呢?
参考文章:https://segmentfault.com/a/1190000002783245
首先要知道的是:
git push 的完整命令是: git push [<options>] [<repository> [<refspec>...]] 注:带有[]表示是可选项
其实git 对于push操作有个default行为,但是根据git版本不同,push的默认行为是不同的;
那么首先得确定自己的git版本是多少:
> git --version
(如果忘记命令是什么,则先打git -help ,它会提示你的;只要会英语的,看见version,应该就明白该怎么做了)
> git version 2.6.4.window.1
(笔者的版本是这个,就以这个为例)
在Git的2.0之前,push.default属性默认被设为'matching',2.0之后被改成为'simple'。
(当然这个属性也是可以指定的,具体方法见下)
push.default的可选值:nothing , current , upstream , simple , matching
注:push.default默认值的意思是只执行git push以后发生的操作
各自的意义:
- nothing : 无默认操作,需要显示地指定远程分支;eg : git push origin branchname
- current : push当前分支到远程同名分支,如果远程同名分支不存在则自动创建同名分支
- upstream : push当前分支到它的upstream分支上
- simple : 与upstream类似,但有一点不同,就是simple必须保证本地分支和它的远程分支upstream分支同名,否则会拒绝push操作。
- matching : push所有本地和远程两端都存在的同名分支
查看分支的upstream命令: get config --get branch.<分支名>.remote
例如:查看本地master分支的upstream
> git config --get branch.master.remote
origin
再来解释一下upstream , 其实upstream和downstream是一对的,它的意思如下:
假设有两个仓库A和B,当我们把仓库A中x分支的代码push到仓库B中的y分支上,则B中的y分支是A中的x分支的upstream;A中x分支是B中y分支的downstream。
介绍完理论,介绍一下实际应用的情况:
一般情况下,在实际的工作中,我们往往是从远程仓库中clone代码到自己的本地仓库。
情况一:
在本地的master上进行代码开发,此时本地分支与远程upstream分支是同名的。
注:clone以后的本地master分支的upstream是origin
在master分支上进行n(n>0)次commit操作以后,执行git push命令以后,不管git的版本是什么,都可以push上去
情况二:
clone代码以后,在本地创建新的分支,在新分支上进行开发,同时push的时候也push新分支
(关于新分支在push前要进行的fetch , merge等操作,来维持与远程仓库中的master保持一致,在以后的篇章中再细讲)
创建新分支命令:
>git branch new
切换到新的分支
> git checkout new
这两条命令也可以合并为一个命令:
> git checkout -b new
在new分支上进行n(n>0)次commit操作以后,执行git push命令以后,由于是第一次提交,远程上并不存在同名分支,也没有upstream,所以会报错(如下图):(其实git在提示错误的同时,已经提示你该怎么做了,真的好友好呀!)
如果new分支在很长时间内都需要push,则可以在首次push的时候,加上-u(或者是 --set-upstream);
> git push -u origin 20160125-app-bc-pro
选项: -u / --set-upstream :是设置该分支(20160125-app-bc-pro)的upstream。
要设置分支的upstream,也可以显示的设置:
> git branch -u origin/20160125-app-bc-pro (将当前的本地分支,追踪远程分支origin/20160125-app-bc-pro,即为当前分支设置upstream)
也可以使用命令:
> git branch --set-upstream-to=origin/20160125-app-bc-pro 20160125-app-bc-pro
为本地20160125-app-bc-pro分支设置upstream。
设置完以后,在以后的push操作中就可以直接执行git push操作啦!(前提是在20160125-app-bc-pro分支上提交,并且没有修改push.default默认值)
如果想要删除分支的upstream信息,可以使用命令:
> git branch --unset-upstream (删除当前分支的upstream信息)
当然如果你对git设置的push.default默认值有意见,或者不喜欢,或。。。想要改变它,也必须是可以的,命令是:
例如要修改成nothing :
> git config --global push.default nothing
(其实,这个命令git在刚才的报错提示中也已经显示给你啦!so智能,再赞一个!)