寫於: 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智能,再贊一個!)
