Nova暮春Gamejam知識分享---版本管理

出品|Nova常務組&Rasp

不好的味道
我們假設你有這么一個功能

這幾乎是一個用來求解斐波那契數(shù)列第 n 項的函數(shù),它也許很不完善,但如果你只需要前四項,那也挺好??捎幸惶欤愕男枨笞兞?,需要求解的項數(shù)變得非常大,大到你無法通過繼續(xù)擴充這個函數(shù)來完成。你決定對代碼進行一些破壞性的更新,總的來說,你希望獲得下面這個感覺的代碼。我們稱原本的函數(shù)為 alpha,而你新寫的版本為 beta。

于是你刪掉了原來的函數(shù) Fib(nth),著手寫這個新函數(shù)。就在函數(shù)寫了一半的時候,你突然意識到你可以進一步優(yōu)化內存占用。你希望新函數(shù)是下面這個感覺,它將被我們稱為 beta*:

你把寫了一半的源文件拷貝了一份存在別的地方,然后把內容改寫成你最后想要的樣子。
你嗅到了一絲不好的味道:你擁有三個版本的源代碼,其中兩份在你的硬盤上,只有一份是可用的。
更不好的味道
你寫的 Fib(nth) 函數(shù)的調用者部分的代碼并不是你來寫的——你和你的朋友們共同維護一個項目。無論怎么說,你總是把一個可用的函數(shù)寫出來了,你把你的源代碼文件通過即時通訊軟件發(fā)給你的朋友。
在收到你的源代碼后,你的朋友意識到你的函數(shù)缺少了一點安全檢查,這點小事就不需要喊你來改了,他給你的函數(shù)加上了一行,這個新版本被他稱為 beta1*:

巧合的是,你也發(fā)現(xiàn)了這一點。理所當然地,你也給源代碼加上了一行,我們稱這個新版本為 beta**:

你感到代碼正在散發(fā)著更不好的味道:你和你的協(xié)作者擁有兩份內容不同但都完成同一個功能的源代碼。
除臭球
這里我們只考慮了一份源代碼中的一份文件,如果我們將討論的范疇擴大:當我們要管理一個項目里面的復數(shù)份源代碼的時候會如何呢?更進一步,當我們需要管理項目配置文件的時候又會如何呢?
無論怎樣,我們都需要一個工具來幫助我們管理我們的源代碼,它應該做到這樣的事情:
1.擁有我們的源代碼,以及它們的歷史。
2.我們應該能同時擁有一份源代碼的平行的不同歷史。
3.我們能夠對比同一份源代碼的歷史版本,并選擇我們要的那份。
4.我們的協(xié)作者應當能做到跟我們一樣的事情。
幸好,已經有了相當多這樣的工具,它們被稱為版本管理工具。
它們通常會提供一些概念來簡化版本管理的過程。比較流行的是分支模型:我們所有的代碼版本都存放在存儲庫中,它們的歷史通過在分支上的后繼關系表示,而平行的源代碼歷史則用平行的分支表示。我們可以根據(jù)這個原理把上文提到的代碼表示成這樣:

接著,我們可以對分支進行操作。比如把 beta1* 和 beta** 合并為一個版本,你可以通過選擇其中任意一份源代碼版本或者改寫一份新的源代碼版本來做到這點:

最后,我們期望的多人協(xié)作功能也可以以這種方式實現(xiàn):

我們每個人的機器上都擁有一份完整的存儲庫,而我們當前的源代碼狀況就可以表示成我們在存儲庫分支上的位置。先前我們通過合并版本創(chuàng)建了一個新版本并將我們的位置移動到 gamma,而我們的協(xié)作者仍然在他的版本 beta1* 上。這時我們的協(xié)作者可以同步我們的存儲庫歷史并選擇前進:

讓我們用分支的語言來描述我們之前做的事情:
開始,我們處于 alpha 版本上,那是我們的舊 Fib(nth) 函數(shù)。
然后,我們決定創(chuàng)建一個新版本 beta,它擁有一個改寫過的 Fib(nth) 函數(shù)。
我們意識到另一種寫法會更好,為了不破壞我們現(xiàn)有的工作,我們決定從 alpha 創(chuàng)建一個新分支,并將我們的另一種寫法的 Fib(nth) 存儲版本 beta* 里面。
我們最終選擇了 beta* 版本,并將歷史同步到存儲庫。
我們和協(xié)作者分別從 beta* 中創(chuàng)建了新的版本,由于它們是平行的,所以相當于創(chuàng)建了分支。
我們從同步的存儲庫歷史中發(fā)現(xiàn)了這一點,決定將它們合并成一個新版本 gamma。
我們的協(xié)作者也發(fā)現(xiàn)了這一點,于是他們前進到版本 gamma。
具體一點
至此,你應該明白我們?yōu)槭裁磿枰姹竟芾砉ぞ吆桶姹竟芾砉ぞ呷绾螏椭覀兞恕,F(xiàn)在,是時候談一談具體的工具了。
事實上,可選擇的工具相當多樣,F(xiàn)reeBSD 項目曾經也在苦惱該將項目中的源代碼遷移到什么版本管理工具中,所以他們將最流行的一些工具列了一個表格,用來對比它們的優(yōu)缺點。常見的源代碼項目通常會使用 Git 或 Mercurial 等,但他們在應對圖片和音頻等大文件上存在短板,所以又有如 Plastic SCM 這類天生能管理大文件的版本管理工具。

當然,最流行的工具之一 Git 的詳細用法并不涵蓋在本文的內容中。不如說,我認為用文字復述一遍文檔并沒有意義,而如何利用 Git 賦予我們的能力來管理我們的源代碼也在上文詳細地敘述了。學會使用 Git 或其他同類工具的辦法就是先翻翻對應的文檔,然后在你的源代碼庫中使用它。你也可以在網絡上找到很多教你認識 Git 命令的教程。

你也許也需要一個安全的地方練習 Git 的基本用法,以免一不小心把所有的源代碼歷史都丟了,我這里推薦 Learn Git Branching,它通過一個模擬環(huán)境和幾個交互式的問題來讓你快速上手 Git。這大概會花掉你半天的時間,但相信我,這是值得的。


官方微信:
NovaIndieGameClub
官方郵箱:
hi@novaindiegame.club
B站官號:
Nova獨游社
