Git GUI – (4) fetch、merge、pull、解決衝突情況(conflict)
接續上篇文章 Git GUI – (3) branch、conflict、merge。
【六、取得最新檔案(fetch, merge, pull)】
在開發程式的時候,可能在同一時間有許多工程師做修改的動作,剛開始可以先用 fetch 指令來查看看遠端倉儲中是否有較新的檔案。如果有最新檔案,可以使用合併(merge)來將檔案合併到目前本地倉儲。fetch 跟 pull 的功能非常類似,fetch 負責檢查遠端倉儲中是否有更新版本的檔案,接著讓工程師手動合併檔案;而 pull 則是先呼叫 fetch 檢查有無新版本後,由系統自動做合併動作,也就是 pull = fetch + merge。遇到無法解決的衝突(conflict)才需要透過手動處理。
開始改動檔案前先檢查是否有檔案版本是否有更新。滑鼠右鍵 -> TortoiseGit -> Fetch
「64f1f65..7c8a8af master -> origin/master」表示有檔案更新(如上圖),並且已經將檔案儲存在暫存區。下圖[up to date]則是表示目前本地倉儲中的檔案已經是最新版本(與遠端倉儲一致)。
(此步驟目的在檢查版本差異,可跳過直接進入第5點合併差異)如果沒有版本更新就可以不用理會,若有版本更新要處理,可透過滑鼠右鍵「TortoiseGit」選單,接著點選「Diff with previous version」來查看有哪些內容的變更。
點選「RefBrowse」設定要比較的來源檔案,將 Version 1 設定成遠端倉儲分支,Version 2 設定成本地倉儲分支。
設定完 Ref 後,如下圖,下方的框框會顯示這兩個版本有哪些變動。(修改了README.txt,以及多了一個 newFile.txt 檔案。在檔案上點選滑鼠左鍵兩下,可以看到兩個版本的檔案內容比較。
開始進行合併動作,滑鼠右鍵「TortoiseGit」選單 ->「Merge…」,選擇要合併的分支,並填寫 Merge Message。如果沒有發生衝突,合併完成後會出現 Success 字樣。
接著我們嘗試使用 pull 來更新並合併版本庫。滑鼠右鍵「TortoiseGit」選單 -> 「Pull…」。選取遠端要 pull 的倉儲分支,出現 Success 的字樣表示成功合併。
【七、衝突情況】
衝突是使用版本控制經常遇到的情況,以下將介紹衝突處理方式。
如下圖,當 push 檔案回遠端倉儲時,出現以下錯誤訊息。
當 push 發生衝突時,可以透過 (1) fetch+merge 或 (2) pull 來解決。以下只說明使用 fetch + merge 處理方式( pull 操作較為簡單,可自行練習使用)。
滑鼠右鍵「TortoiseGit」選單 -> 「Fetch…」
從遠端倉儲抓了較新的資料,接著我們把他和我們的版本合併在一起。滑鼠右鍵「TortoiseGit」選單 -> 「Merge…」。From的部份要選擇遠端的分支,例如:remotes/origin/master,填入Merge Message。
系統自動執行合併時發現有衝突,導致無法自動合併。關閉視窗後,可以看到衝突的檔案變成黃色三角形驚嘆號。
在 newFile.txt 上點選滑鼠右鍵開啟「TortoiseGit」選單 -> 「Diff」,即可開始編輯有衝突的部份(符號說明),修改完成後儲存檔案。
接著把剛剛做的變更 commit 到本地倉儲中。
將本地倉儲的變更 push 到遠端倉儲,以上為衝突發生時的處理流程。
本文完。有很多情況下沒辦法使用 GUI 介面,可到參考資料1, 參考資料2, 參考資料3,這三篇文章涵蓋了幾乎所有新手會遇到的問題!
參考資料
- Git 教學(1) : Git 的基本使用 @ 好麻煩部落格http://gogojimmy.net/2012/01/17/how-to-use-git-1-git-basic/
- Git 教學(2):Git Branch 的操作與基本工作流程 @ 好麻煩部落格http://blog.gogojimmy.net/2012/01/21/how-to-use-git-2-basic-usage-and-worflow/
- Git 情境劇 @ 好麻煩部落格http://blog.gogojimmy.net/2012/02/29/git-scenario/
Git 系列文章: