工做中,咱們會用到git pull來從遠程倉庫"同步"代碼,一般有三種方式;git
git pull origin <remote_branch>:<local_branch>
git pull origin <remote_branch>
git pullgithub
這三種用法充分詮釋了什麼是簡即繁,繁即簡;看上去簡單的,每每背後蘊藏玄機;測試
測試環境: 本地分支:master和dev 遠程分支:master和dev $ git branch -a * dev master remotes/origin/HEAD -> origin/master remotes/origin/dev remotes/origin/master
這種用法寫起來最爲繁瑣,但最好理解:fetch
場景:當本地的當前分支不是local_branch;
做用:將遠程分支拉取到指定本地分支;url
例如:當前分支是dev,可是你想把遠程master」同步」到本地master,但又不想使checkout切換到master分支;
這時你就可使用git pull origin master:masterspa
zhangchangzhi@ZBXXXX /e/02.Workspace-test/gitTest (dev) $ git pull origin master:master From https://github.com/jinxintang/gitTest a09fdc4..941758f master -> master Already up-to-date.
從上述代碼能夠看到,我當前分支爲dev,但執行"同步」操做的倒是在master分支;code
有了上面的例子,這種使用方法的場景和做用就好理解了:orm
場景:在當前分支上進行同步操做;
做用:將指定遠程分支同步到當前本地分支;rem
廢話不說,上代碼:同步
zhangchangzhi@ZBXXX /e/02.Workspace-test/gitTest (dev) $ git pull origin master From https://github.com/jinxintang/gitTest * branch master -> FETCH_HEAD Already up-to-date.
把遠程master分支同步到HEAD分支(HEAD分支指向當前位置);
這種寫法最簡單,也最經常使用,可是隱含的知識也是最多的;
場景:本地分支已經和想要拉取的分支創建了「關聯」關係;
做用:拉取全部遠程分支的新版本"座標",並同步當前分支的本地代碼(具體根據關聯分支而定)
首先咱們先使用git branch -vv
查看一下目前分支的「關聯」狀況;
$ git branch -vv * dev 1a1b215 [origin/dev] Merge branch 'master' of https://github.com/jinxintang/gitTest into dev master a09fdc4 [origin/master] create pull
能夠看到咱們的本地的dev關聯的是遠程(origin)的dev,本地的master關聯的是遠程(origin)的master;
那麼這種關聯是如何創建、是否能夠修改呢;
配置本地分支與遠程分支的三種方法:
1.檢出時創建關聯關係:git checkout -b dev origin/dev
當咱們檢查時,git會自動爲咱們檢出的分支和遠程分支創建關聯關係;
2.提交時配置關聯關係:git push -u origin <remote_branch>
或git push --set-upstream origin <remote_branch>
zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_zcz) $ git branch -vv * dev_zcz 3b7001a [origin/dev] cm master a09fdc4 [origin/master] create pull zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_zcz) $ git push -u origin dev_zcz Everything up-to-date Branch dev_zcz set up to track remote branch dev_zcz from origin. zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_zcz) $ git branch -vv * dev_zcz 3b7001a [origin/dev_zcz] cm master a09fdc4 [origin/master] create pull
經過上面的例子能夠看到push前dev_zcz關聯的是origin/dev,執行push -u 後管理分支改成origin/dev_zcz
注:默認配置下,提交時本地分支需和遠程分支同名;
3.更改git/config文件:git branch --set-upstream-to=<remote_branch>
zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_zcz) $ git branch --set-upstream-to=origin/zcz Branch dev_zcz set up to track local branch origin/zcz. zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_zcz) $ git branch -vv * dev_zcz 3b7001a [origin/zcz] cm master a09fdc4 [origin/master] create pull origin/zcz 3b7001a [dev_zcz] cm
不管使用上述那種方法,本地分支和遠程分支的「關聯」最終都會寫到config文件;
zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest/.git (GIT_DIR!) $ cat config [core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true [remote "origin"] url = https://github.com/jinxintang/gitTest.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master [branch "dev_zcz"] remote = . merge = refs/heads/origin/zcz [branch "origin/zcz"] remote = . merge = refs/heads/dev_zcz
注:本項目的配置信息存放目錄:項目所在目錄/.git/config
看完這三種配置關聯分支的方法,想必你們已經對「關聯分支」有了必定了解;
關聯分支:在git中表現爲upstream,不管是使用push -u 或是 git branch --set-upstream-to方法,均會將這種對應關係寫入.git/config配置文件,若是一個本地分支沒有關聯分支,則沒法執行 git push 或 git pull指令;
沒有"關聯"分支的狀況下,使用push會先讓你設置一個upstream branch.
zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_no_upstream) $ git branch -vv * dev_no_upstream 3b7001a cm dev_zcz 3b7001a [origin/zcz] cm master a09fdc4 [origin/master] create pull origin/zcz 3b7001a [dev_zcz] cm zhangchangzhi@ZB-PF0SB6DQ MINGW64 /e/02.Workspace-test/gitTest (dev_no_upstream) $ git push fatal: The current branch dev_no_upstream has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin dev_no_upstream
那麼創建了一個關聯分支,是否就必定能使用git push呢?請閱讀<git 實踐(二)push的使用>