2014年1月15日 星期三

Git(七) pull vs fetch

甚麼是git fetch

git fetch就是將遠端的資料update 到local端,簡單的說就是讓local端知道遠端最新的位置是在哪
舉個例子 如下圖
先不管server端的部分,
origin/hello2 為遠端的本地參照位置,hello2為目前實際的位置。

假設 遠端原本只有 aaa bbb ccc三個commit 
然後user A和B 皆使用 git clone , 他們的origin/hello2都會是在 ccc的位置,
hello2也會在ccc的位置

假設user B  commit 並 push 了 ddd,這時user A的 origin/hello2依然是在 ccc
那 user A 該如何更新origin/hello2到 ddd呢?
user A只需要使用 git fetch origin hello2 
這樣 user A的 origin/hello2就會更新到 ddd的位置

fetch 會去更新origin/hello2(本地參照)

解釋完git fetch之後,要解釋git pull就相對簡單許多



甚麼是git pull


git pull 實際作用為 git fetch  +  git merge

舉個例子

假設目前在遠端上面有人 commit 並push了  aaa 和 bbb
而我在本地端commit 了 ccc的功能

假設打入指令 git fetch origin hello2 這時會將origin/hello2 更新到bbb的位置
接著使用git merge origin hello2就會變成 如下圖
然而這個結果跟直接使用 git pull的結果是一樣的

git pull 不只會更新本地參照還會自動進行merge branch。


比較安全的用法

從server上拉資料之前  
總是先使用git fetch更新本地參照
接著先確認是否有其他的分支
若無其他分支,如下圖  則使用git pull  fast forward到 Origin/hello2


若有其他分支,如下圖
則檢查是否有需要merge 若有則使用 git merge。




結論

git fetch是相對較安全的做法,假設想要知道server上最新的版本但是還不想本地端還有一些功能還沒開發完,或是基於某些原因還不想merge的話可以使用git fetch,這樣本地只會取得server上最新版本但是並不會merge到本地端,

假設使用git pull 代表本地端功能已經開發完成可以進行合併,使用git pull就會直接將本地端跟server上做合併的動作。



沒有留言:

張貼留言