“嗨,阿米戈!”
“你好!”
“今天我將向您介紹版本控制系統。”
“正如您可能已經知道的那樣,程序通常非常大,需要很長時間才能編寫。有時,幾十個人可能要花數年才能編寫一個程序。”
“擁有數百萬行代碼的項目是現實。”
“哇哦。”
“這一切都非常複雜。人們經常互相干擾,經常修改相同的代碼,等等。”
“為了解決這個問題,程序員開始為他們的代碼使用版本控制系統。”
"版本控制系統是由客戶端和服務器組成的程序。
“程序將數據(程序員編寫的代碼)存儲在服務器上,程序員使用客戶端對其進行添加或更改。”
“版本控制系統與僅使協作處理文檔成為可能的程序之間的主要區別在於,它存儲所有文檔(代碼文件)的所有先前版本。”
“你能給我更多的細節嗎?這一切是如何運作的?”
“想像一下,你是一名程序員,你想要對存儲在服務器存儲庫中的程序的源代碼進行微小的更改。”
“這是你需要做的:”
“1)登錄服務器。”
“2) 使用 Checkout 命令將所有文件的最新版本複製到您的計算機。”
“3) 更改所需文件。”
“4)在本地運行程序,確保編譯運行。”
“5) 使用 Commit 命令將您的‘更改’發送到服務器。”
“這通常是有道理的。”
“但還有更多。想像一下,你早上上班,但在印度已經是午餐時間了。所以你的印度同事已經進行了更改,並將他們的更改提交到你服務器上的存儲庫。”
“您需要使用最新版本的代碼。因此您執行更新命令。”
“這與Checkout有何不同?”
“ Checkout旨在復制存儲庫的所有文件,但 Update 僅更新自上次運行Checkout / Update命令以來服務器上已更新的文件。”
“這大概是它的工作原理:”
結帳:
“現在,假設我們更改了文件 B 並希望將其上傳到服務器。為此,我們需要使用Commit命令。”
“更新命令的工作原理如下:”
“有意思!還有別的命令嗎?”
“是的,有很多。但它們會根據您選擇的版本控製程序而有所不同。所以,我只是試圖解釋一般原則。”
“還有一個操作叫做merging——合併兩個文件。假設兩個程序員同時修改了同一個文件。那麼服務器上的程序將不允許同時提交兩個更改。誰先提交就可以添加他的或者她的改變。”
“那對方是做什麼的?”
“他或她將被邀請執行更新操作以從服務器獲取最新的更改。順便說一句,這——在提交之前進行更新——是一種很好的做法。”
“然後,在更新操作期間,客戶端程序將嘗試將本地更改與從服務器接收到的更改合併。”
“如果程序員更改了文件的不同部分,那麼版本控製程序將可能能夠成功合併它們。 如果更改在同一個地方,那麼版本控製程序將報告合併衝突並提示用戶手動合併更改。”
“例如,當兩個程序員都向文件末尾添加內容時,通常會發生這種情況。”
“原來如此。總的來說,這似乎是合理的。”
“還有一件事:樹枝。”
“想像一下,來自一個團隊的兩名程序員的任務是重寫同一個模塊。或者甚至更好——從頭開始重寫它。在這個模塊完成之前,程序將無法運行,甚至可能無法編譯。”
“那他們該怎麼辦?”
“他們通過向存儲庫添加分支來向前推進。粗略地說,這意味著存儲庫分為兩部分。不是按文件或目錄,而是按版本。”
“想像一下,電從未被發現,機器人也從未被發明。那麼三次解放戰爭就永遠不會發生,整個人類歷史就會走上一條完全不同的道路。 ”
“這條道路是歷史的另一個分支。”
“或者你可以試著把一個分支簡單地想像成存儲庫的一個副本。換句話說,在某個時候,我們在服務器上克隆了一個存儲庫,這樣,除了主存儲庫(通常稱為主幹), 我們還有一家分店。”
“嗯,這似乎更容易理解。
“你為什麼不能直接說我們複製了存儲庫?”
“這不是簡單的複制。”
“這些樹枝既可以脫離主幹,又可以併入主乾之中。”
“換句話說,一些工作可以在一個分支中完成,然後當它完成時你可以將存儲庫分支添加到存儲庫主幹中?”
“是的。”
“那些文件會怎樣?”
“文件將被合併。”
“嗯,這聽起來很酷。我希望它在行動中也一樣酷。”
“然後一些。好吧,我們休息一下。”
“這裡有很多有用的信息 ”
GO TO FULL VERSION