只要是在開發程式專案,強烈建議導入版本控制的機制,為什麼?如果有太依賴 Ctrl + Z、Ctrl + Y 然後發生慘案,如:復原次數超過上限、IDE 意外終止、Win 10 自動更新重新開機...等等情形,本來就不該使用復原及重作當作版本控制方案。
另外最主要版本控制精隨在於:歷史修改歷程記錄及多人開發協作的支援,若還沒使用過版本控制,應該從現在開始養成習慣。
將專案開發過程切分成數個片段進行版本控制有個好處:當你的程式碼有上千行,且發現 Bug 卻一直無法找到問題點時,利用版本控制能夠找到最後正常的點,再與現行版本比較,限縮你需要查驗的範圍。人的記憶力有限,在每次的版本推送中加入適當的註解,幫助你回憶你做過的 "好事",千萬別太依賴自己的記憶能力...。
專案開發免不了多人同時開發,版控中的衝突與合併是必須要學習的技能,透過 IDE 支援,能夠清楚的比對本機版本 (Local) 與伺服器版本 (Server) 的差異,在每次推送時若有衝突都會要求編輯者決定正確版本再推送,避免人員之間的修改重複覆蓋,即便發生了強制覆蓋的情形,在歷史記錄中都會保留當時的修正,除了便於復原外,始作俑者一目瞭然。
接著進入 Android Studio 進行版本控制機制的設定,各位可以使用先前 Day 03~05 的第一個專案來進行操作。首先開啟設定 (Ctrl + Alt + S) 視窗,在左側選單中找到 Version Control,先暫時不需要展開它,直接在標題上點一下,就能看到目前專案的版本控制選項,一般來說會是空的,接著點選右邊的 + 進行下一步驟。
通常我們會以一個專案當作版控實體,當然也可以用整個資料夾當作版控目標,在此資料夾內的所有檔案都會自動加入版控範圍,VCS 欄位可挑選慣用的版本控制服務,初學者可以選擇 Github 不用下功夫建立版本控制伺服器環境,這部分 Github 已經幫你處理好,只要透過網站註冊並建立專案,就能取得一組專案版控網址,再到 Studio 中選擇 Github 服務並使用該組專案版控網址,即可完成設定。
Github 免費帳戶限制是所有專案上去都是公開狀態,若需要私人權限限制另有付費方案,本教學另選自建於企業內部的 Git 版控環境來講解,Git Server 建置因作業系統有分 (Mac OS X, Windows, Linux/Unix),在網路上各有許多詳細的教學文章,在此就不另行敘述。
若電腦尚未安裝過 Git Client,可以到 Version Control > Git 確認一下,在 Path to Git executable 檢查是否有偵測到 git.exe,若這邊是空的話,可以到 https://git-scm.com/download/win 網站下載 Git for windows,請格外注意作業系統版本及位元,安裝完成後,再將 Path 重新指定。
除了 Git 外,也可以指定使用其它服務,如:CVS、Mercurial、Subversion (SVN)、GitHub,接著可以透過上方選單 > VCS 開始使用版本控制功能。
Local History > Show History 會由程式自動記錄每次的程式修改歷程,小至一個字的修正或刪除都會記錄著,系統預設儲存 500 次的修改,若需要增加可回復次數或刪除以往的記錄,可以到 Setting > Version Control > Background > VCS History Cache Settings > Changelists to cache initially 進行調整。
Local History > Put Label 則是提供你新增一個標籤識別,好讓日後有需要復原時能快速找到標籤著的版本。復原的操作方式很簡單,直接在想要復原的版本上點一下左鍵,反白後按左上角紅框處的 Revert (復原),也可以直接在版本上按右鍵,也有 Revert 可以選擇。因為 Studio 的編輯器【重做】快捷鍵是 Ctrl + Shift + Z,跟其它程式常用的為 Ctrl + Y 不同,常常會發生意外...所以這個功能幫作者化解很多危機。
下圖左側視窗顯示的是每次修改歷程,最新的排列在最上方,右側視窗則顯示舊版本與新版本的對應。
今日課程帶到版本控制的概念與本機基本操作,下一章將會說明更完整的版本控制流程操作,我們明天見!
資料參考
Git Merge Conflicts: Android Programming
https://www.youtube.com/watch?v=RxunYSzMNKM如何使用版本控制系統-進階篇
https://backlog.com/git-tutorial/tw/stepup/stepup1_1.htmlKotlin 官方程式語言手冊
https://kotlinlang.org/docs/reference/