SourceTree版本控管(七) - 基本功能介紹 Fetch / Pull

  • Fetch
當一個commit被其他協作開發者push到remote(在此代表Bitbucket)之後,我們需要將remote最新的commit下載到自己的local端才能使用新的功能,這個下載的動作稱為fetch,在說明fetche的特性之前,我們先假設一個開發情境。





  1. 在這個repository之中,存在著master / develop / stage1 / rule 與 enemy 這五個branch。
  2. master與develop為主要的兩個branch,我們可以直接忽略。
  3. stage1是從develop分歧出去的branch,當stage1的功能全部完成後會才會merge回develop。
  4. rule與enemy是從stage1分歧出去的branch,負責開發stage1所需要的兩個功能。
  5. stage1的整個branch和其附屬的分支(rule與enemy)由UserA與UserB同時協作開發。



這樣的情境設定比較偏向實際開發的環境,並不是什麼特別狀況的案例,我們大概看過就好,比較需要注意的操作細節在下面。



目前rule branch的開發版本包含以下項目。


而enemy branch的開發版本包含以下項目。



UserA與UserB當前的repository是完全同步的狀態。



接著UserB在本地端的enemy branch增加了新功能,並且將最新的commit版本 push到remote。




UserA被告知有新的版本push了,開始準備將remote的進度同步到自己的local端。首先點選上方工具列的Fetch按鈕。



接著出現提示視窗,按下OK。



我們並沒有看到新的commit出現,但是enemy branch出現了上下箭頭的符號。



這裡必須先做個說明,在每個User的local端之中,一個repository除了local端本身的branch之外,還包含了remote的branch。而我們fetch的項目都會更新到這個remote branch裡面。



我們可以勾選Show Romote Branches來檢視這些項目,在下圖中可以看到剛剛fetch的內容已經更新到orgin/enemy branch上面了,而enemy branch後面的上下箭頭符號,就是用來提醒開發者local 與remote 這兩個branch的版本已經出現了差異。



這時候我們需要把remote 與 local的branch做一次merge。先切換到enemy branch,並且點選Merge按鈕。



勾選Show Remote Branches,選擇origin/enemy 這個branch後按下OK。



到這裡才算完成local branch的同步。



UserB開發的新功能也可以使用了。



由以上的操作流程我們可以整理出兩個重點。


  1. 一個local repository同時包含了local branches與remote branches。
  2. fetch 必須與 merge搭配使用。







  • Pull
Pull跟fetch的功能非常相似,我們可以這麼去理解它:

"將remote端的新版本fetch到local端之後,自動將local端的local branch與remote branch執行一次merge。"

意思就是我們可以不需要手動去執行merge這個動作,下面我們將實際操作一次。



UserB再次在enemy branch上commit一個新的版本,並且push到remote端。



UserA在被告知後,首先切換到enemy branch,並且點選了Pull按鈕。



接著跳出提示視窗,確認Remote branch to pull與 Pull into local branch 一致之後按下OK

這裡的操作必須要非常小心。如果上述兩個欄位指向的branch不同將會導致預期之外的結果,而目前SourceTree版本(v1.7.0.32509)又沒有任何防呆機制,因此每次執行pull都必須注意再注意才行!

Pull一次只能針對一個branch,如果我們有多個branch 要pull,每個branch都需要個別執行。




執行完pull之後,local enemy branch隨即同步了最新的功能,到這邊就完成了repository的同步。




由以上的操作流程我們可以整理出兩個重點。
  1. Pull因為省略了merge的操作,我們可以更方便的同步repository。
  2. Pull如果操作錯誤將會造成預期外的結果,在使用時必須非常小心。關於fetch與pull,搜尋一下會發現許多開發者建議使用fetch + merge的做法比較保險。





  • 輔助功能
除了點選工具列上的Fetch按鈕之外,我們也可以點選工具選單中的Repository>Refresh Remote Status來執行fetch,差別在於後者的作法在fetch之後Pull按鈕會出現事件提醒,操作上會比較直覺一些。





如果我們不想手動操作Refresh Remote Status,可以點選工具選單中的Tools>Options。



在General標籤頁找到Check default remotes for updates every n minutes這個欄位,
勾選狀態下每隔一段時間都會自動執行remote refresh(預設為勾選狀態)。




總結:

Fetch與pull都是將remote commit同步到local端,差別在於pull會在fetch之後自動執行merge。

上述幾個方法並沒有絕對的優缺,這邊就由開發者自行斟酌使用。

而Git系統的基本功能介紹到本章節也告一個段落。





下面的章節整理了一些關於GitFlow的網路資源。
SourceTree版本控管(八) -  GitFlow


留言

熱門文章