Progress, far from consisting in change, depends on retentiveness. Those who cannot remember the past are condemned to repeat it.
— George Santayana, Life of Reason
核心概念#
我們在使用者介面中最重視的功能之一就是 undo 鍵——一個能原諒我們錯誤的按鈕。如果環境支援多層次的復原和重做就更好了。
但如果錯誤是上週犯的,你已經開關電腦十次了呢?這就是版本控制系統(VCS)的眾多好處之一:它是一個巨大的 undo 鍵——一個專案級的時光機,可以帶你回到上週那個程式碼還能編譯和執行的美好日子。
共享目錄不是版本控制。在網路上或雲端儲存中分享專案原始碼的團隊,會不斷弄亂彼此的工作、丟失變更、導致建置失敗。這就像在沒有同步機制的情況下撰寫並行程式碼。
從原始碼開始#
版本控制系統會追蹤你在原始碼和文件中所做的每一個變更。透過正確配置的版本控制,你永遠可以回到之前的版本。
VCS 能做的遠不止復原錯誤:
- 追蹤變更:誰修改了這行程式碼?目前版本和上週的差異?
- 標記軟體發行版本,之後隨時可以回溯和重新產生
- 允許多個使用者同時在同一組檔案上工作,管理合併
Tip 28 - Always Use Version Control(永遠使用版本控制)
永遠。即使你是單人團隊、一週的專案、「用完即丟」的原型、甚至不是原始碼的東西。確保一切都在版本控制下:文件、電話簿、備忘錄、Makefile、建置和發佈程序——一切。作者甚至用版本控制管理這本書的文字。
分支#
版本控制不只保留專案的單一歷史。最強大和實用的功能之一是讓你將開發隔離成稱為分支(branches)的島嶼。
- 隔離性:你在一個分支開發功能 A,隊友在另一個分支開發功能 B,互不干擾
- 工作流程的核心:分支往往是團隊專案工作流程的核心
版本控制的分支和測試組織有一個共通點:都有成千上萬的人告訴你該怎麼做。這些建議大多是無意義的,因為他們真正說的是「這是對我有用的做法」。使用版本控制,遇到工作流程問題時搜尋可能的解決方案,並隨經驗調整。
版本控制作為專案中心#
雖然版本控制對個人專案就非常有用,但在團隊合作時更能發揮其真正價值。許多團隊配置好 VCS,讓推送到特定分支就自動建置系統、執行測試,成功的話就部署新程式碼到生產環境。
選擇託管服務時,尋找以下特性:
- 良好的安全性和存取控制
- 直覺的 UI
- 從命令列操作一切的能力
- 自動化建置和測試
- 良好的分支合併支援(pull request)
- 議題管理(理想上整合到提交和合併中)
- 良好的報告功能(Kanban 看板等)
- 良好的團隊溝通(郵件通知、wiki 等)
相關章節#
- Topic 11,可逆性
- Topic 49,務實的團隊
- Topic 51,務實的入門套件