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,務實的入門套件