自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Git前時(shí)代:使用CVS進(jìn)行版本控制

開(kāi)源 系統(tǒng)
GitHub 網(wǎng)站發(fā)布于 2008 年。如果你的軟件工程師職業(yè)生涯跟我一樣,也是晚于此時(shí)間的話,Git 可能是你用過(guò)的唯一版本控制軟件。雖然其陡峭的學(xué)習(xí)曲線和不直觀地用戶界面時(shí)常會(huì)遭人抱怨,但不可否認(rèn)的是,Git 已經(jīng)成為學(xué)習(xí)版本控制的每個(gè)人的選擇。

 

GitHub 網(wǎng)站發(fā)布于 2008 年。如果你的軟件工程師職業(yè)生涯跟我一樣,也是晚于此時(shí)間的話,Git 可能是你用過(guò)的唯一版本控制軟件。雖然其陡峭的學(xué)習(xí)曲線和不直觀地用戶界面時(shí)常會(huì)遭人抱怨,但不可否認(rèn)的是,Git 已經(jīng)成為學(xué)習(xí)版本控制的每個(gè)人的選擇。Stack Overflow 2015 年進(jìn)行的開(kāi)發(fā)者調(diào)查顯示,69.3% 的被調(diào)查者在使用 Git,幾乎是排名第二的 Subversion 版本控制系統(tǒng)使用者數(shù)量的兩倍。1 2015 年之后,也許是因?yàn)?Git 太受歡迎了,大家對(duì)此話題不再感興趣,所以 Stack Overflow 停止了關(guān)于開(kāi)發(fā)人員使用的版本控制系統(tǒng)的問(wèn)卷調(diào)查。

GitHub 的發(fā)布時(shí)間距離 Git 自身發(fā)布時(shí)間很近。2005 年,Linus Torvalds 發(fā)布了 Git 的首個(gè)版本?,F(xiàn)在的年經(jīng)一代開(kāi)發(fā)者可能很難想象“版本控制軟件”一詞所代表的世界并不僅僅只有 Git,雖然這樣的世界誕生的時(shí)間并不長(zhǎng)。除了 Git 外,還有很多可供選擇。那時(shí),開(kāi)源開(kāi)發(fā)者較喜歡 Subversion,企業(yè)和視頻游戲公司使用 Perforce (到如今有些仍在用),而 Linux 內(nèi)核項(xiàng)目依賴于名為 BitKeeper 的版本控制系統(tǒng)。

其中一些系統(tǒng),特別是 BitKeeper,會(huì)讓年經(jīng)一代的 Git 用戶感覺(jué)很熟悉,上手也很快,但大多數(shù)相差很大。除了 BitKeeper,Git 之前的版本控制系統(tǒng)都是以不同的架構(gòu)模型為基礎(chǔ)運(yùn)行的?!?a class="ext" rel="external nofollow" target="_blank">Version Control By Example》一書(shū)的作者 Eric Sink 在他的書(shū)中對(duì)版本控制進(jìn)行了分類,按其說(shuō)法,Git 屬于第三代版本控制系統(tǒng),而大多數(shù) Git 的前身,即流行于二十世紀(jì)九零年代和二十一世紀(jì)早期的系統(tǒng),都屬于第二代版本控制系統(tǒng)。2 第三代版本控制系統(tǒng)是分布式的,第二代是集中式。你們以前大概都聽(tīng)過(guò) Git 被描述為一款“分布式”版本控制系統(tǒng)。我一直都不明白分布式/集中式之間的區(qū)別,隨后自己親自安裝了一款第二代的集中式版本控件系統(tǒng),并做了相關(guān)實(shí)驗(yàn),至少明白了一些。

我安裝的版本系統(tǒng)是 CVS。CVS,即 “并發(fā)版本系統(tǒng)Concurrent Versions System” 的縮寫(xiě),是最初的第二代版本控制系統(tǒng)。大約十年間,它是最為流行的版本控制系統(tǒng),直到 2000 年被 Subversion 所取代。即便如此,Subversion 被認(rèn)為是 “更好的 CVS”,這更進(jìn)一步突出了 CVS 在二十世紀(jì)九零年代的主導(dǎo)地位。

CVS 最早是由一位名叫 Dick Grune 的荷蘭科學(xué)家在 1986 年開(kāi)發(fā)的,當(dāng)時(shí)有一個(gè)編譯器項(xiàng)目,他正在尋找一種能與其學(xué)生合作的方法。3 CVS 最初僅僅只是一個(gè)包裝了 RCS(修訂控制系統(tǒng)Revision Control System) 的 Shell 腳本集合,Grune 想改進(jìn)這個(gè)第一代的版本控制系統(tǒng)。 RCS 是按悲觀鎖模式工作的,這意味著兩個(gè)程序員不可以同時(shí)處理同一個(gè)文件。需要編輯一個(gè)文件話,首先得向 RCS 系統(tǒng)請(qǐng)求一個(gè)排它鎖,鎖定此文件直到完成編輯,如果你想編輯的文件有人正在編輯,你就必須等待。CVS 在 RCS 基礎(chǔ)上改進(jìn),并把悲觀鎖模型替換成樂(lè)觀鎖模型,迎來(lái)了第二代版本控制系統(tǒng)的時(shí)代?,F(xiàn)在,程序員可以同時(shí)編輯同一個(gè)文件、合并編輯部分,隨后解決合并沖突問(wèn)題。(后來(lái)接管 CVS 項(xiàng)目的工程師 Brian Berliner 于 1990 年撰寫(xiě)了一篇非常易讀的關(guān)于 CVS 創(chuàng)新的 論文。)

從這個(gè)意義上來(lái)講,CVS 與 Git 并無(wú)差異,因?yàn)?Git 也是運(yùn)行于樂(lè)觀鎖模式的,但也僅僅只有此點(diǎn)相似。實(shí)際上,Linus Torvalds 開(kāi)發(fā) Git 時(shí),他的一個(gè)指導(dǎo)原則是 WWCVSND,即 “CVS 不能做的What Would CVS Not Do”。每當(dāng)他做決策時(shí),他都會(huì)力爭(zhēng)選擇那些在 CVS 設(shè)計(jì)里沒(méi)有使用的功能選項(xiàng)。4 所以即使 CVS 要早于 Git 十多年,但它對(duì) Git 的影響是反面的。

我非常喜歡折騰 CVS。我認(rèn)為要弄明白為什么 Git 的分布式特性是對(duì)以前的版本控制系統(tǒng)的極大改善的話,除了折騰 CVS 外,沒(méi)有更好的辦法。因此,我邀請(qǐng)你跟我一起來(lái)一段激動(dòng)人心的旅程,并在接下來(lái)的十分鐘內(nèi)了解下這個(gè)近十年來(lái)無(wú)人使用的軟件。(可以看看文末“修正”部分)

CVS 入門(mén)

CVS 的安裝教程可以在其 項(xiàng)目主頁(yè) 上找到。MacOS 系統(tǒng)的話,可以使用 Homebrew 安裝。

由于 CVS 是集中式的,所以它有客戶端和服務(wù)端之區(qū)分,這種模式 Git 是沒(méi)有的。兩端分別有不同的可執(zhí)行文件,其區(qū)別不太明顯。但要開(kāi)始使用 CVS 的話,即使只在你的本地機(jī)器上使用,也必須設(shè)置 CVS 的服務(wù)后端。

CVS 的后端,即所有代碼的中央存儲(chǔ)區(qū),被叫做存儲(chǔ)庫(kù) repository。在 Git 中每一個(gè)項(xiàng)目都有一個(gè)存儲(chǔ)庫(kù),而 CVS 中一個(gè)存儲(chǔ)庫(kù)就包含所有的項(xiàng)目。盡管有辦法保證一次只能訪問(wèn)一個(gè)項(xiàng)目,但一個(gè)中央存儲(chǔ)庫(kù)包含所有東西是改變不了的。

要在本地創(chuàng)建存儲(chǔ)庫(kù)的話,請(qǐng)運(yùn)行 init 命令。你可以像如下所示在家目錄創(chuàng)建,也可以在你本地的任何地方創(chuàng)建。

  1. $ cvs -d ~/sandbox init

CVS 允許你將選項(xiàng)傳遞給 cvs 命令本身或 init 子命令。出現(xiàn)在 cvs 命令之后的選項(xiàng)默認(rèn)是全局的,而出現(xiàn)在子命令之后的是子命令特有選項(xiàng)。上面所示例子中,-d 標(biāo)志是全局選項(xiàng)。在這兒是告訴 CVS 我們想要?jiǎng)?chuàng)建存儲(chǔ)庫(kù)路徑在哪里,但一般 -d 標(biāo)志指的是我們想要使用的且已經(jīng)存在的存儲(chǔ)庫(kù)位置。一直使用 -d 標(biāo)志很單調(diào)乏味,所以可以設(shè)置 CVSROOT 環(huán)境變量來(lái)代替。

因?yàn)槲覀冎皇窃诒镜夭僮?,所以僅僅使用 -d 參考來(lái)傳遞路徑就可以,但也可以包含個(gè)主機(jī)名。

此命令在你的家目錄創(chuàng)建了一個(gè)名叫 sandbox 的目錄。 如果你列出 sandbox 內(nèi)容,會(huì)發(fā)現(xiàn)下面包含有名為 CVSROOT 的目錄。請(qǐng)不要把此目錄與我們的環(huán)境變量混淆,它保存存儲(chǔ)庫(kù)的管理文件。

恭喜! 你剛剛創(chuàng)建了第一個(gè) CVS 存儲(chǔ)庫(kù)。

檢入代碼

假設(shè)你決定留存下自己喜歡的顏色清單。因?yàn)槟闶且粋€(gè)有藝術(shù)傾向但很健忘的人,所以你鍵入顏色列表清單,并保存到一個(gè)叫 favorites.txt 的文件中:

  1. blue
  2. orange
  3. green
  4.  
  5. definitely not yellow

我們也假設(shè)你把文件保存到一個(gè)叫 colors 的目錄中?,F(xiàn)在你想要把喜歡的顏色列表清單置于版本控制之下,因?yàn)閺默F(xiàn)在起的五十年間你會(huì)回顧下,隨著時(shí)間的推移自己的品味怎么變化,這件事很有意思。

為此,你必須將你的目錄導(dǎo)入為新的 CVS 項(xiàng)目??梢允褂?import 命令:

  1. $ cvs -d ~/sandbox import -m "" colors colors initial
  2. N colors/favorites.txt
  3.  
  4. No conflicts created by this import

這里我們?cè)俅问褂?-d 標(biāo)志來(lái)指定存儲(chǔ)庫(kù)的位置,其余的參數(shù)是傳輸給 import 子命令的。必須要提供一條消息,但這兒沒(méi)必要,所以留空。下一個(gè)參數(shù) colors,指定了存儲(chǔ)庫(kù)中新目錄的名字,這兒給的名字跟檢入的目錄名稱一致。最后的兩個(gè)參數(shù)分別指定了 “vendor” 標(biāo)簽和 “release” 標(biāo)簽。我們稍后就會(huì)談?wù)摌?biāo)簽。

我們剛將 colors 項(xiàng)目拉入 CVS 存儲(chǔ)庫(kù)。將代碼引入 CVS 有很多種不同的方法,但這是 《Pragmatic Version Control Using CVS》 一書(shū)所推薦方法,這是一本關(guān)于 CVS 的程序員實(shí)用指導(dǎo)書(shū)籍。使用這種方法有點(diǎn)尷尬的就是你得重新檢出check out工作項(xiàng)目,即使已經(jīng)存在有 colors 此項(xiàng)目了。不要使用該目錄,首先刪除它,然后從 CVS 中檢出剛才的版本,如下示:

  1. $ cvs -d ~/sandbox co colors
  2. cvs checkout: Updating colors
  3. U colors/favorites.txt

這個(gè)過(guò)程會(huì)創(chuàng)建一個(gè)新的目錄,也叫做 colors。此目錄里會(huì)發(fā)現(xiàn)你的源文件 favorites.txt,還有一個(gè)叫 CVS 的目錄。這個(gè) CVS 目錄基本上與每個(gè) Git 存儲(chǔ)庫(kù)的 .git 目錄等價(jià)。

做出改動(dòng)

準(zhǔn)備旅行。

和 Git 一樣,CVS 也有 status 命令:

  1. $ cvs status
  2. cvs status: Examining .
  3. ===================================================================
  4. File: favorites.txt Status: Up-to-date
  5.  
  6. Working revision: 1.1.1.1 2018-07-06 19:27:54 -0400
  7. Repository revision: 1.1.1.1 /Users/sinclairtarget/sandbox/colors/favorites.txt,v
  8. Commit Identifier: fD7GYxt035GNg8JA
  9. Sticky Tag: (none)
  10. Sticky Date: (none)
  11. Sticky Options: (none)

到這兒事情開(kāi)始陌生起來(lái)了。CVS 沒(méi)有提交對(duì)象這一概念。如上示,有一個(gè)叫 “提交標(biāo)識(shí)符Commit Identifier” 的東西,但這可能是一個(gè)較新版本的標(biāo)識(shí),在 2003 年出版的《Pragmatic Version Control Using CVS》一書(shū)中并沒(méi)有提到 “提交標(biāo)識(shí)符” 這個(gè)概念。 (CVS 的最新版本于 2008 年發(fā)布的。5

在 Git 中,我們所談?wù)撃澄募姹酒鋵?shí)是在談?wù)撊?commit 45de392 相關(guān)的東西,而 CVS 中文件是獨(dú)立版本化的。文件的第一個(gè)版本為 1.1 版本,下一個(gè)是 1.2 版本,依此類推。涉及分支時(shí),會(huì)在后面添加擴(kuò)展數(shù)字。因此你會(huì)看到如上所示的 1.1.1.1 的內(nèi)容,這就是示例的版本號(hào),即使我們沒(méi)有創(chuàng)建分支,似乎默認(rèn)的會(huì)給加上。

一個(gè)項(xiàng)目中會(huì)有很多的文件和很多次的提交,如果你運(yùn)行 cvs log 命令(等同于 git log),會(huì)看到每個(gè)文件提交歷史信息。同一個(gè)項(xiàng)目中,有可能一個(gè)文件處于 1.2 版本,一個(gè)文件處于 1.14 版本。

繼續(xù),我們對(duì) 1.1 版本的 favorites.txt 文件做些修改(LCTT 譯注:原文此處示例有誤):

  1. blue
  2. orange
  3. green
  4. cyan
  5.  
  6. definitely not yellow

修改完成,就可以運(yùn)行 cvs diff 來(lái)看看 CVS 發(fā)生了什么:

  1. $ cvs diff
  2. cvs diff: Diffing .
  3. Index: favorites.txt
  4. ===================================================================
  5. RCS file: /Users/sinclairtarget/sandbox/colors/favorites.txt,v
  6. retrieving revision 1.1.1.1
  7. diff -r1.1.1.1 favorites.txt
  8. 3a4
  9. > cyan

CVS 識(shí)別出我們我在文件中添加了一個(gè)包含顏色 “cyan” 的新行。(實(shí)際上,它說(shuō)我們已經(jīng)對(duì) “RCS” 文件進(jìn)行了更改;你可以看到,CVS 底層使用的還是 RCS。) 此差異指的是當(dāng)前工作目錄中的 favorites.txt 副本與存儲(chǔ)庫(kù)中 1.1.1.1 版本的文件之間的差異。

為了更新存儲(chǔ)庫(kù)中的版本,我們必須提交更改。Git 中,這個(gè)操作要好幾個(gè)步驟。首先,暫存此修改,使其在索引中出現(xiàn),然后提交此修改,最后,為了使此修改讓其他人可見(jiàn),我們必須把此提交推送到源存儲(chǔ)庫(kù)中。

而 CVS 中,只需要運(yùn)行 cvs commit 命令就搞定一切。CVS 會(huì)匯集它所找到的變化,然后把它們放到存儲(chǔ)庫(kù)中:

  1. $ cvs commit -m "Add cyan to favorites."
  2. cvs commit: Examining .
  3. /Users/sinclairtarget/sandbox/colors/favorites.txt,v <-- favorites.txt
  4. new revision: 1.2; previous revision: 1.1

我已經(jīng)習(xí)慣了 Git,所以這種操作會(huì)讓我感到十分恐懼。因?yàn)闆](méi)有變更暫存區(qū)的機(jī)制,工作目錄下任何你動(dòng)過(guò)的東西都會(huì)一股腦給提交到公共存儲(chǔ)庫(kù)中。你有過(guò)因?yàn)椴凰?,私下里重?xiě)了某個(gè)同事不佳的函數(shù)實(shí)現(xiàn),但僅僅只是自我宣泄一下并不想讓他知道的時(shí)候嗎?如果不小心提交上去了,就太糟糕了,他會(huì)認(rèn)為你是個(gè)混蛋。在推送它們之前,你也不能對(duì)提交進(jìn)行編輯,因?yàn)樘峤痪褪峭扑?。還是你愿意花費(fèi) 40 分鐘的時(shí)間來(lái)反復(fù)運(yùn)行 git rebase -i 命令,以使得本地提交歷史記錄跟數(shù)學(xué)證明一樣清晰嚴(yán)謹(jǐn)?很遺憾,CVS 里不支持,結(jié)果就是,大家都會(huì)看到你沒(méi)有先寫(xiě)測(cè)試用例。

不過(guò),到現(xiàn)在我終于理解了為什么那么多人都覺(jué)得 Git 沒(méi)必要搞那么復(fù)雜。對(duì)那些早已經(jīng)習(xí)慣直接 cvs commit 的人來(lái)說(shuō),進(jìn)行暫存變更和推送變更操作確實(shí)是毫無(wú)意義的差事。

人們常談?wù)?Git 是一個(gè) “分布式” 系統(tǒng),其中分布式與非分布式的主要區(qū)別為:在 CVS 中,無(wú)法進(jìn)行本地提交。提交操作就是向中央存儲(chǔ)庫(kù)提交代碼,所以沒(méi)有網(wǎng)絡(luò)連接,就無(wú)法執(zhí)行操作,你本地的那些只是你的工作目錄而已;在 Git 中,會(huì)有一個(gè)完完全全的本地存儲(chǔ)庫(kù),所以即使斷網(wǎng)了也可以無(wú)間斷執(zhí)行提交操作。你還可以編輯那些提交、回退、分支,并選擇你所要的東西,沒(méi)有任何人會(huì)知道他們必須知道的之外的東西。

因?yàn)樘峤皇莻€(gè)大事,所以 CVS 用戶很少做提交。提交會(huì)包含很多的內(nèi)容修改,就像如今我們能在一個(gè)含有十次提交的拉取請(qǐng)求中看到的一樣多。特別是在提交觸發(fā)了 CI 構(gòu)建和自動(dòng)測(cè)試程序時(shí)如此。

現(xiàn)在我們運(yùn)行 cvs status,會(huì)看到產(chǎn)生了文件的新版本:

  1. $ cvs status
  2. cvs status: Examining .
  3. ===================================================================
  4. File: favorites.txt Status: Up-to-date
  5.  
  6. Working revision: 1.2 2018-07-06 21:18:59 -0400
  7. Repository revision: 1.2 /Users/sinclairtarget/sandbox/colors/favorites.txt,v
  8. Commit Identifier: pQx5ooyNk90wW8JA
  9. Sticky Tag: (none)
  10. Sticky Date: (none)
  11. Sticky Options: (none)

合并

如上所述,在 CVS 中,你可以同時(shí)編輯其他人正在編輯的文件。這是 CVS 對(duì) RCS 的重大改進(jìn)。當(dāng)需要將更改的部分重新組合在一起時(shí)會(huì)發(fā)生什么?

假設(shè)你邀請(qǐng)了一些朋友來(lái)將他們喜歡的顏色添加到你的列表中。在他們添加的時(shí)候,你確定了不再喜歡綠色,然后把它從列表中刪除。

當(dāng)你提交更新的時(shí)候,會(huì)發(fā)現(xiàn) CVS 報(bào)出了個(gè)問(wèn)題:

  1. $ cvs commit -m "Remove green"
  2. cvs commit: Examining .
  3. cvs commit: Up-to-date check failed for `favorites.txt'
  4. cvs [commit aborted]: correct above errors first!

這看起來(lái)像是朋友們首先提交了他們的變化。所以你的 favorites.txt 文件版本沒(méi)有更新到存儲(chǔ)庫(kù)中的最新版本。此時(shí)運(yùn)行 cvs status 就可以看到,本地的 favorites.txt 文件副本有一些本地變更且是 1.2 版本的,而存儲(chǔ)庫(kù)上的版本號(hào)是 1.3,如下示:

  1. $ cvs status
  2. cvs status: Examining .
  3. ===================================================================
  4. File: favorites.txt Status: Needs Merge
  5.  
  6. Working revision: 1.2 2018-07-07 10:42:43 -0400
  7. Repository revision: 1.3 /Users/sinclairtarget/sandbox/colors/favorites.txt,v
  8. Commit Identifier: 2oZ6n0G13bDaldJA
  9. Sticky Tag: (none)
  10. Sticky Date: (none)
  11. Sticky Options: (none)

你可以運(yùn)行 cvs diff 來(lái)了解 1.2 版本與 1.3 版本的確切差異:

  1. $ cvs diff -r HEAD favorites.txt
  2. Index: favorites.txt
  3. ===================================================================
  4. RCS file: /Users/sinclairtarget/sandbox/colors/favorites.txt,v
  5. retrieving revision 1.3
  6. diff -r1.3 favorites.txt
  7. 3d2
  8. < green
  9. 7,10d5
  10. <
  11. < pink
  12. < hot pink
  13. < bubblegum pink

看來(lái)我們的朋友是真的喜歡粉紅色,但好在他們編輯的是此文件的不同部分,所以很容易地合并此修改。跟 git pull 類似,只要運(yùn)行 cvs update 命令,CVS 就可以為我們做合并操作,如下示:

  1. $ cvs update
  2. cvs update: Updating .
  3. RCS file: /Users/sinclairtarget/sandbox/colors/favorites.txt,v
  4. retrieving revision 1.2
  5. retrieving revision 1.3
  6. Merging differences between 1.2 and 1.3 into favorites.txt
  7. M favorites.txt

此時(shí)查看 favorites.txt 文件內(nèi)容的話,你會(huì)發(fā)現(xiàn)你的朋友對(duì)文件所做的更改已經(jīng)包含進(jìn)去了,你的修改也在里面?,F(xiàn)在你可以自由的提交文件了,如下示:

  1. $ cvs commit
  2. cvs commit: Examining .
  3. /Users/sinclairtarget/sandbox/colors/favorites.txt,v <-- favorites.txt
  4. new revision: 1.4; previous revision: 1.3

最終的結(jié)果就跟在 Git 中運(yùn)行 git pull --rebase 一樣。你的修改是添加在你朋友的修改之后的,所以沒(méi)有 “合并提交” 這操作。

某些時(shí)候,對(duì)同一文件的修改可能導(dǎo)致沖突。例如,如果你的朋友把 “green” 修改成 “olive”,同時(shí)你完全刪除 “green”,就會(huì)出現(xiàn)沖突。CVS 早期的時(shí)候,正是這種情況導(dǎo)致人們擔(dān)心 CVS 不安全,而 RCS 的悲觀鎖機(jī)制可以確保此情況永不會(huì)發(fā)生。但 CVS 提供了一個(gè)安全保障機(jī)制,可以確保不會(huì)自動(dòng)的覆蓋任何人的修改。因此,當(dāng)運(yùn)行 cvs update 的時(shí)候,你必須告訴 CVS 想要保留哪些修改才能繼續(xù)下一步操作。CVS 會(huì)標(biāo)記文件的所有變更,這跟 Git 檢測(cè)到合并沖突時(shí)所做的方式一樣,然后,你必須手工編輯文件,選擇需要保留的變更進(jìn)行合并。

這兒需要注意的有趣事情就是在進(jìn)行提交之前必須修復(fù)并合并沖突。這是 CVS 集中式特性的另一個(gè)結(jié)果。而在 Git 里,在推送本地的提交內(nèi)容之前,你都不用擔(dān)心合并沖突問(wèn)題。

標(biāo)記與分支

由于 CVS 沒(méi)有易于尋址的提交對(duì)象,因此對(duì)變更集合進(jìn)行分組的唯一方法就是對(duì)于特定的工作目錄狀態(tài)打個(gè)標(biāo)記。

創(chuàng)建一個(gè)標(biāo)記是很容易的:

  1. $ cvs tag VERSION_1_0
  2. cvs tag: Tagging .
  3. T favorites.txt

稍后,運(yùn)行 cvs update 命令并把標(biāo)簽傳輸給 -r 標(biāo)志就可以把文件恢復(fù)到此狀態(tài),如下示:

  1. $ cvs update -r VERSION_1_0
  2. cvs update: Updating .
  3. U favorites.txt

因?yàn)槟阈枰粋€(gè)標(biāo)記來(lái)回退到早期的工作目錄狀態(tài),所以 CVS 鼓勵(lì)創(chuàng)建大量的搶先標(biāo)記。例如,在重大的重構(gòu)之前,你可以創(chuàng)建一個(gè) BEFORE_REFACTOR_01 標(biāo)記,如果重構(gòu)出錯(cuò),就可以使用此標(biāo)記回退。你如果想生成整個(gè)項(xiàng)目的差異文件的話,也可以使用標(biāo)記?;旧希缃裎覀儜T常使用提交的哈希值完成的事情都必須在 CVS 中提前計(jì)劃,因?yàn)槟惚仨毷紫扔袀€(gè)標(biāo)簽才行。

可以在 CVS 中創(chuàng)建分支。分支只是一種特殊的標(biāo)記,如下示:

  1. $ cvs rtag -b TRY_EXPERIMENTAL_THING colors
  2. cvs rtag: Tagging colors

這命令僅僅只是創(chuàng)建了分支(每個(gè)人都這樣覺(jué)得吧),所以還需要使用 cvs update 命令來(lái)切換分支,如下示:

  1. $ cvs update -r TRY_EXPERIMENTAL_THING

上面的命令就會(huì)把你的當(dāng)前工作目錄切換到新的分支,但《Pragmatic Version Control Using CVS》一書(shū)實(shí)際上是建議創(chuàng)建一個(gè)新的目錄來(lái)房子你的新分支。估計(jì),其作者發(fā)現(xiàn)在 CVS 里切換目錄要比切換分支來(lái)得更簡(jiǎn)單吧。

此書(shū)也建議不要從現(xiàn)有分支創(chuàng)建分支,而只在主線分支(Git 中被叫做 master)上創(chuàng)建分支。一般來(lái)說(shuō),分支在 CVS 中主認(rèn)為是 “高級(jí)” 技能。而在 Git 中,你幾乎可以任性創(chuàng)建新分支,但 CVS 中要在真正需要的時(shí)候才能創(chuàng)建,比如發(fā)布項(xiàng)目。

稍后可以使用 cvs update-j 標(biāo)志將分支合并回主線:

  1. $ cvs update -j TRY_EXPERIMENTAL_THING

感謝歷史上的貢獻(xiàn)者

2007 年,Linus Torvalds 在 Google 進(jìn)行了一場(chǎng)關(guān)于 Git 的 演講。當(dāng)時(shí) Git 是很新的東西,整場(chǎng)演講基本上都是在說(shuō)服滿屋子都持有懷疑態(tài)度的程序員們:盡管 Git 是如此的與眾不同,也應(yīng)該使用 Git。如果沒(méi)有看過(guò)這個(gè)視頻的話,我強(qiáng)烈建議你去看看。Linus 是個(gè)有趣的演講者,即使他有些傲慢。他非常出色地解釋了為什么分布式的版本控制系統(tǒng)要比集中式的優(yōu)秀。他的很多評(píng)論是直接針對(duì) CVS 的。

Git 是一個(gè) 相當(dāng)復(fù)雜的工具。學(xué)習(xí)起來(lái)是一個(gè)令人沮喪的經(jīng)歷,但也不斷的給我驚喜:Git 還能做這樣的事情。相比之下,CVS 簡(jiǎn)單明了,但是,許多我們認(rèn)為理所當(dāng)然的操作都做不了。想要對(duì) Git 的強(qiáng)大功能和靈活性有全新的認(rèn)識(shí)的話,就回過(guò)頭來(lái)用用 CVS 吧,這是種很好的學(xué)習(xí)方式。這很好的詮釋了為什么理解軟件的開(kāi)發(fā)歷史可以讓人受益匪淺。重拾過(guò)期淘汰的工具可以讓我們理解今天所使用的工具后面所隱藏的哲理。

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2010-05-19 15:57:38

CVS與SVN

2010-05-17 13:34:47

2021-02-26 07:35:57

Git版本工具

2009-03-23 09:53:47

LinuxGNOMEGit版本

2016-08-22 11:46:53

GitLinux開(kāi)源

2010-06-02 14:16:18

SVN版本控制

2011-01-26 09:09:06

版本控制系統(tǒng)GitLinux

2011-04-08 18:00:19

GitSubversion版本控制系統(tǒng)

2021-01-26 05:17:54

RESTfulAPI

2020-11-23 07:27:22

Git Flow

2013-01-08 10:20:40

EclipseEclipse基金會(huì)CVS

2014-12-16 11:02:06

PythonGitHub

2021-02-06 17:55:41

微服務(wù)Maven版本控制

2022-02-18 10:47:43

GocommitSVN

2010-03-03 16:20:42

2011-06-15 10:08:01

Qt CVS

2012-12-12 13:44:31

Git

2012-02-02 16:58:02

Eclipse

2011-04-08 10:10:23

2010-05-31 11:30:57

SVN使用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)