git fetch與git pull的區別
git fetch和git pull都可以將遠端倉庫更新至本地那麼他們之間有何區別?想要弄清楚這個問題有有幾個概念不得不提。
FETCH_HEAD
: 是一個版本連結,記錄在本地的一個檔案中,指向著目前已經從遠端倉庫取下來的分支的末端版本。
commit-id
:在每次本地工作完成後,都會做一個git commit 操作來儲存當前工作到本地的repo, 此時會產生一個commit-id,這是一個能唯一標識一個版本的序列號。 在使用git push後,這個序列號還會同步到遠端倉庫。
git fetch
有了以上的概念再來說說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分支 可以用這步刪除
-
如果直接使用git fetch,則步驟如下:
建立並更新本 地遠端分支。即建立並更新origin/xxx 分支,拉取程式碼到origin/xxx分支上。
在FETCH_HEAD中設定當前分支-origin/當前分支對應,如直接到時候git merge就可以將origin/abc合併到abc分支上。 -
git fetch origin
只是手動指定了要fetch的remote。在不指定分支時通常預設為master -
git fetch origin dev
指定遠端remote和FETCH_HEAD,並且只拉取該分支的提交。
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將更為快捷。