git 實踐(一) pull的使用

前言

工做中,咱們會用到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

1.git pull origin <remote_branch>:<local_branch>

這種用法寫起來最爲繁瑣,但最好理解: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

2.git pull origin <remote_branch>

有了上面的例子,這種使用方法的場景和做用就好理解了: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分支指向當前位置);

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@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的使用>

相關文章
相關標籤/搜索