Git 遠程分支的pull與push
遠程分支信息查看
git branch -r #查看遠程分支
git branch -a #查看所有分支,本地和遠程
git remote show [remote-name] #查看遠程倉庫信息
其中git remote show [remote-name]展示的信息包括:
- 會列出遠程倉庫的 URL 與跟蹤分支的信息
- 列出了當你在特定的分支上執行 git push 會自動地推送到哪一個遠程分支
- 列出了哪些遠程分支不在你的本地
- 哪些遠程分支已經從服務器上移除了
- 執行 git pull 時哪些分支會自動合並
- ……
檢出遠程非master分支到本地
git checkout -b local origin/daily/dev
上面的方法可以直接檢出遠程分支到本地,在本地新建local分支,並切換到local分支上,注意本地分支和遠程分支不同名。
這個方法會自動創建遠程分支 /daily/dev
和本地分支local
的跟蹤關系, 通過git remote show origin
可以看到包含如下信息:
Local branches configured for 'git pull':
local merges with remote /daily/dev
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
其中
Local branches configured for 'git pull':
下的就是upstream
跟蹤分支。
可以看出,遠程分支 /daily/dev
和本地分支local
建立了git pull
的關系,但是沒有建立git push
的關系。此時如果強行push,不會成功,會出現如下提示:
fatal: The current branch new has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin develop
Git默認push設置
我們知道通過git clone git@gitlab.xxx.com:xxxxx.git
可以建立默認的本地master分支和遠程master分支的pull和push的關系,但是我們無法通過clone命令檢出非master分支,那么對於非master分支怎么辦呢?
Git中push.default
可以指定在沒有明確指定遠程分支的情況下,默認push的遠程分支,其取值可以是:
- nothing - push操作無效,除非顯式指定遠程分支(想讓push變得簡單的就不要用這個)
- current - push當前分支到遠程同名分支,如果遠程同名分支不存在則自動創建同名分支(central 和 non-central workflows都適用)
- upstream - push當前分支到它的upstream分支上(通常用於central workflow)
- simple - simple和upstream是相似的(通常用於central workflow),只有一點不同,simple必須保證本地分支和它的遠程 upstream分支同名,否則會拒絕push操作
- matching - push所有本地和遠程兩端都存在的同名分支
central / non-central workflows 是Git的兩種常見工作流場景:
- central workflows - 集中式工作流,一個分支的push和pull都是同一個遠程倉庫
- non-central workflows - 非集中式工作流,一個分支的push和pull可能分別都有不同的遠程倉庫
在Git 2.0之前,push.default
的內建值被設為'matching',2.0之后則被更改為了'simple'。
在了解push.default之后,我們有如下幾種比較好的從遠程分支檢出本地分支的方法(基於V2.0+):
解法一
所以如果你只有一個遠程倉庫,且你想檢出的分支名稱和遠程分支不同名(有些管理工具會自動生成比較丑的遠程分支名,類似:/features/2017-03-31-featuresA-1),那么你可以通過設置push.default 默認推送到pull的遠程分支(upstream 分支):
#檢出重命名
git checkout -b dev origin/features/2017-03-31-featuresA-1
#設置push.default為upstream
git config --global push.default upstream
#or
git config push.default upstream
#取消設置
git config --unset push.default
解法二
如果不想通過修改upstream,那么只能通過設置檢出本地分支名稱和遠程分支名稱相同:
git checkout -b <BRANCH-NAME> <REMOTE-NAME>/<BRANCH-NAME>
注意:如果使用git checkout -b features/feature_1 origin/features/feature_1
檢出,那么遠程分支名稱是features/feature_1
,而不是origin/features/feature_1
。
解法三
這個也不算什么解法,但是強烈推薦,就是建立遠程分支的時候,取個好點的名字。
git clone git@gitlab.xxx.com:xxxxx.git
#從master建立新分支
git checkout -b dev
#push並建立同名遠程分支
git push origin dev