git fetch和git pull都可以將遠端倉庫更新到本地那麼他們之間有何區別?想要弄清楚這個問題有有幾個概念不得不提。
FETCH_HEAD: 是一個版本鏈接,記錄在本地的一個檔案中,指向著目前已經從遠端倉庫取下來的分支的末端版本。
commit-id:在每次本地工作完成後,都會做一個git commit 操作來保存目前工作到本地的repo, 此時會產生一個commit-id ,這是一個能唯一標識一個版本的序號。使用git push後,這個序號也會同步到遠端倉庫。
有了以上的概念再來說git fetch
git fetch:這將更新git remote 中所有的遠端倉庫所包含分支的最新commit-id,將其記錄到.git/FETCH_HEAD檔案中
git fetch更新遠端倉庫的方式如下:
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,則步驟如下:
#建立並更新本機遠端分支。即建立並更新origin/xxx 分支,拉取程式碼到origin/xxx分支上。
在FETCH_HEAD中設定目前分支-origin/目前分支對應,例如直接到時候git merge就可以將origin/abc合併到abc分支上。
(2)git fetch origin
只是手動指定了要fetch的remote。在不指定分支時通常預設為master
(3)git fetch origin dev
指定遠端remote和FETCH_HEAD,並且只拉取該分支的提交。
這個指令會存取遠端倉庫,從中拉取所有你還沒有的資料。執行完成後,你將會擁有那個遠端倉庫中所有分支的引用,可以隨時合併或檢視。
如果你使用git clone 指令複製了一個倉庫,指令會自動將其新增為遠端倉庫(git remote -v)並預設以 “origin” 為簡寫。所以,git fetch origin 會抓取克隆(或上次抓取)後新推送的所有工作。必須注意 git fetch 指令會將資料拉取到你的本地倉庫 - 它並不會自動合併或修改你目前的工作。當準備好時你必須手動將其合併入你的工作中。
如果你有一個分支設定為追蹤一個遠端分支,可以使用 git pull指令來自動的抓取然後合併遠端分支到目前分支。這對你來說可能是一個更簡單或更舒適的工作流程;預設情況下,git clone 命令會自動設定本地 master 分支追蹤克隆的遠端倉庫的 master 分支(或不管是什麼名字的預設分支)。執行 git pull 通常會從最初複製的伺服器上抓取資料並自動嘗試合併到目前所在的分支。
git pull : 首先,基於本地的FETCH_HEAD記錄,比對本地的FETCH_HEAD記錄與遠端倉庫的版本號,然後git fetch 取得目前指向的遠端分支的後續版本的數據,然後再利用git merge將其與本地的當前分支合併。所以可以認為git pull是git fetch和git merge兩個步驟的結合。
git pull的用法如下:
git pull <远程主机名> <远程分支名>:<本地分支名> //取回远程主机某个分支的更新,再与本地的指定分支合并。
因此,與git pull相比git fetch相當於是從遠端取得最新版本到本地,但不會自動merge。如果需要有選擇的合併git fetch是更好的選擇。效果相同時git pull會更為快速。
註:用git pull更新程式碼的話就比較簡單暴力了但是根據commit ID來看的話,他們實際的實作原理是不一樣的,所以不要用git pull,用git fetch和git merge更加安全。
推薦教學:《Git》
以上是「git fetch」與「git pull」的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!