前言
工作中,我們會用到git pull來從遠程倉庫"同步"代碼,通常有三種方式;
git pull origin <remote_branch>:<local_branch>
git pull origin <remote_branch>
git pull
這三種用法充分詮釋了什么是簡即繁,繁即簡;看上去簡單的,往往背后蘊藏玄機;
測試環境: 本地分支:master和dev 遠程分支:master和dev $ git branch -a * dev master remotes/origin/HEAD -> origin/master remotes/origin/dev remotes/origin/master
1.git pull origin <remote_branch>:<local_branch>
這種用法寫起來最為繁瑣,但最好理解:
場景:當本地的當前分支不是local_branch;
作用:將遠程分支拉取到指定本地分支;
例如:當前分支是dev,但是你想把遠程master”同步”到本地master,但又不想使checkout切換到master分支;
這時你就可以使用git pull origin master:master
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分支;
2.git pull origin <remote_branch>
有了上面的例子,這種使用方法的場景和作用就好理解了:
場景:在當前分支上進行同步操作;
作用:將指定遠程分支同步到當前本地分支;
廢話不說,上代碼:
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分支指向當前位置);
3.git pull
這種寫法最簡單,也最常用,但是隱含的知識也是最多的;
場景:本地分支已經和想要拉取的分支建立了“關聯”關系;
作用:拉取所有遠程分支的新版本"坐標",並同步當前分支的本地代碼(具體根據關聯分支而定)
什么是"關聯"分支?
首先我們先使用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
無論使用上述那種方法,本地分支和遠程分支的“關聯”最終都會寫到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
那么建立了一個關聯分支,是否就一定能使用git push呢?請閱讀<git 實踐(二)push的使用>