Git 遠程分支的pull與push


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

參考

Git push與pull的默認行為
Git config


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM