詳細瞭解git fetch與git pull的區別

git fetch和git pull均可以將遠端倉庫更新至本地那麼他們之間有何區別?想要弄清楚這個問題有有幾個概念不得不提。html

FETCH_HEAD: 是一個版本連接,記錄在本地的一個文件中,指向着目前已經從遠程倉庫取下來的分支的末端版本。
commit-id:在每次本地工做完成後,都會作一個git commit 操做來保存當前工做到本地的repo, 此時會產生一個commit-id,這是一個能惟一標識一個版本的序列號。 在使用git push後,這個序列號還會同步到遠程倉庫。linux

有了以上的概念再來講說git fetch
git fetch:這將更新git remote 中全部的遠程倉庫所包含分支的最新commit-id, 將其記錄到.git/FETCH_HEAD文件中
git fetch更新遠程倉庫的方式以下:git

git fetch origin master:tmp 
//在本地新建一個temp分支,並將遠程origin倉庫的master分支代碼下載到本地temp分支
git diff tmp 
//來比較本地代碼與剛剛從遠程下載下來的代碼的區別
git merge tmp
//合併temp分支到本地的master分支
git branch -d temp
//若是不想保留temp分支 能夠用這步刪除

(1)若是直接使用git fetch,則步驟以下:fetch

  • 建立並更新本 地遠程分支。即建立並更新origin/xxx 分支,拉取代碼到origin/xxx分支上。
  • 在FETCH_HEAD中設定當前分支-origin/當前分支對應,如直接到時候git merge就能夠將origin/abc合併到abc分支上。

(2)git fetch origin
只是手動指定了要fetch的remote。在不指定分支時一般默認爲masterhtm

(3)git fetch origin dev
指定遠程remote和FETCH_HEAD,而且只拉取該分支的提交。rem

git pull : 首先,基於本地的FETCH_HEAD記錄,比對本地的FETCH_HEAD記錄與遠程倉庫的版本號,而後git fetch 得到當前指向的遠程分支的後續版本的數據,而後再利用git merge將其與本地的當前分支合併。因此能夠認爲git pull是git fetch和git merge兩個步驟的結合。
git pull的用法以下:get

git pull <遠程主機名> <遠程分支名>:<本地分支名>
//取回遠程主機某個分支的更新,再與本地的指定分支合併。

所以,與git pull相比git fetch至關因而從遠程獲取最新版本到本地,但不會自動merge。若是須要有選擇的合併git fetch是更好的選擇。效果相同時git pull將更爲快捷。同步

原文來自: https://www.linuxprobe.com/git-fetch-git-pull.html ‎it

相關文章
相關標籤/搜索