Git 誕生記

Git


你可能有過這樣的經歷:在 debug 的時候這里加一句,那里減一句,順便改改參數,不一會你的程序就從一個 bug 增加到了無數個 bug 。最重要的是,你完全想不起來自己到底改了幾個地方,原來的程序到底長什么樣子了。經歷過幾次這樣的痛苦,你學乖了,下次 debug 之前先把原文件備份一下——改成 program.c.bak 什么的,然后放開了膽子改。有時候修改的次數多了,就會出現 program_V1.c.bak, program_V2.c.bak …… 又有時候需要同時修改多個文件。而需要倒回到之前的版本的時候,又完全想不起來這些 V1, V2 到底改了哪些地方。坑爹吶!難道要老子手工查不成?難道老子還要給每個 version 寫個描述文件?

程序員們應該都中槍了。

或者你有過這樣的經歷:寫論文的時候這里改動一個詞,那里改動一句話。改來改去發現還不如最初的版本……囧之余,你怎么辦?Ctrl+Z 能救你幾次?甚至,萬一是第二天打開 Word 的時候后悔了,又怎么辦?

學生黨們應該都中槍了。

有沒有辦法解決問題?當然有。但是別著急,喝杯茶,我們慢慢聊。

1972年的時候,貝爾實驗室的程序員們快被這個問題煩死了。可能純粹出于提升工作舒適度,他們寫出了史上第一個版本控制系統(Version Control System A.K.A. VCS),取了個直白的名字叫 Source Code Control System,簡稱 SCCS。這個軟件用 C 語言改寫后,被收錄在 AT&T 的系統中。由于太懶了,這群程序員們只寫了 Unix 版本。

SCCS 的原理很簡單,儲存要監控的源文件,當文件被修改時,它自動地為每次修改創建一個快照(Snapshot)。你工作的時候,想切換到哪個版本,它就先取出源文件,再依次應用修改直到你要的那個版本為止。

SCCS 好用是好用,但有幾個問題。首先,當你對文件作出多次、大量修改后,它的速度明顯變慢了——對啊,它要從原文件開始依次應用修改嘛。然后,它內置在 AT&T 生產的系統中,不能跨平臺啊,廣大 Windows 用戶很不開心啊。

這其中 Water.F.Tichy 估計是最不開心的一個。

Water 是一個教計算機的大學教授,學校里的電腦上有 AT&T 的系統,可是到家就沒轍了,老爺子很不爽啊,這叫人家在家怎么刻苦呢?1982年,他一氣之下,寫出了改變歷史的第二個被廣泛應用的 VCS,取名 Revision Control System,也就是大家熟知的 RCS(誰熟知了?誰?)。

從名字上就能看出,老爺子雄心很大,不想讓它僅僅成為程序員們的玩具。RCS 開源,跨平臺,一經推出即在全球……的程序員,和大學中流行。它相比于 SCCS 更快。為什么?因為老爺子機智地換了一個想法,儲存最近的文件作為源文件,對歷史修改反向,并且創建快照(Snapshot)。對呀,正常人工作肯定是從最新的文件開始讀取,出現問題后再回滾到歷史文件,誰沒事就從第一版開始改起啊, SCCS 那種做法也太二了吧?

于是 RCS 開始統治江湖。漸漸地,程序員們又不高興了,說你這個 RCS 也不科學呀,你每次都只能監控單個文件,老爺子你寫個論文什么的倒是還行,可是我們是要寫整個項目的呀,我項目中每個文件是有關聯的呀,你這個單一文件監控不好使呀。被 RCS 折磨了四年之后,程序員們終于忍不了了,不知是哪路豪杰在開源社區吼了一聲,一呼百應,不一會兒(哪有那么快!),新的 VCS 誕生了——Concurrent Versions System(A.K.A. CVS)。

CVS 不能不說是革命性的成果,它不但支持了對整個項目進行監控,并且首次提出了倉庫(Repository)的概念,更加不能忍的是,它明確地分成了服務端和客戶端,把代碼倉庫放在服務器上,由客戶端向服務端提交修改。這還是 1986 年啊同學們,我真想回滾到那個時候激動地告訴他們:小伙子們(為什么是小伙子們……)你們發明的這種概念叫「云」你們造嗎?「云」在二十多年以后有多火你們造嗎?

CVS 很好地支持了多用戶多文件并行操作,按說這樣一來所有人應該都滿意了吧?當然不是,不然今天講的就是 CVS 而不是 Git 了。它的問題是監控的對象是文件,而不是目錄。乍聽起來,覺得好像沒什么呀。其實不然,仔細想想,如果在項目目錄下再創建目錄,這個子目錄里面的文件并不會被監控;同理,添加一個新文件,這個新文件也不會被監控。

程序員們又不開心了。

終于到了21世紀,一個跨時代的 VCS 出現了—— Subversion(A.K.A. SVN)。它由 CollabNet 公司開發,并且在后來被納入了 Apache 軟件項目孵化器(Apache Incubator),成為其中 top-level 的產品。它不但支持監控整個目錄,而且首次支持了監控非文本文件。這兩個特性使它在 2001 年在全球范圍內取代了 CVS,并且一直流行到今天。沒錯,現在許多軟件公司用的版本控制系統還是 SVN。

咦,說好的 Git 呢?

這就不得不提到同時代的另一款 CVS —— BitKeeper。與 SVN 不同,它是一款商業軟件,但提供了免費的社區版本(Community Version)。它最大的優點在于,分布式管理。在 SVN 中,服務端相當于代碼中心,所有的代碼都提交到這里。它兩點不方便的地方在于,客戶端要不斷地和服務端進行交互以保證自己的代碼是最新的,如果自己從一個比較舊的版本開始修改,就會出現問題。而且與服務端的交互要求網絡連接,不適合離線工作。分布式管理的概念是每個倉庫都是主倉庫,當兩個倉庫版本不一致時,可以方便地查看沖突之處并加以修改。

使得 BitKeeper 如此出名的原因還在于,大名鼎鼎的 Linux Kernel 就存放在其免費的社區版本上。

2005年4月,BitMover(擁有 BitKeeper 的那家公司)突然宣布,停止 BitKeeper 的社區版本,你們這群不想交錢就用我們軟件人都玩蛋去!好嘛,改變了人類歷史的 Linux 就這樣無家可歸了。

Linux 之父 Linus 看著自己的兒子被別人趕出了家門,憤怒值立刻飆升。他環繞四周看了看,覺得 SVN 什么的簡直是屎,決不能允許親兒子流落至此。兩斤啤酒下肚,他沖到電腦前三天三夜不眠不休。

Bang!Git 誕生了。

什么?你說 BitKeeper ?玩蛋去吧。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449361.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449361.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449361.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用pandas進行量化回測(akshare)

本人看法,也就比excel高級一點,距離backtrader這些框架又差一點。做最基礎的測試可以,如果后期加入加倉功能,或者是止盈止損等功能,很不合適。只能做最簡單的技術指標測試。所以別太當回事。 導包,常用包導…

【BZOJ4543】【POI2014】Hotel加強版(長鏈剖分)

傳送門 題意:求樹上滿足三點之間距離兩兩相等的三元組個數 n≤1e5n\le 1e5n≤1e5 原題數據是n≤5000n\le5000n≤5000 考慮怎么做f[u][i]f[u][i]f[u][i]表示uuu為根,深度為iii的點的個數g[u][i]g[u][i]g[u][i]表示uuu為根,滿足2點到lcalcalca的…

使用vue+webpack從零搭建項目

vue到現在已經成為一個熱門的框架,在項目實踐當中,如果想要創建一個新項目,通常都會使用vue-cli的腳手架工具,毋容置疑能夠方便很多,很多東西也不需要自己親自去配置。都知道,腳手架其實是vue結合webpack去…

CentOS 6 和 CentOS 7 防火墻的關閉

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。CentOS6.5查看防火墻的狀態: 1[linuxidclocalhost ~]$service iptable status顯示結果: 12345[linuxidclocalhost …

怎樣從Linux終端管理進程:10個你必須知道的命令

本文由 極客范 - Ben Zhang 翻譯自 Chris Hoffman。歡迎加入極客翻譯小組,同我們一道翻譯與分享。轉載請參見文章末尾處的要求。Linux終端有一系列有用的命令。它們可以顯示正在運行的進程、殺死進程和改變進程的優先級。本文列舉了一些經典傳統的命令和一些有用新…

易盛極星多合約回測(問題很多)

注意,使用此函數,在考慮手續費時,無法做到統一。 import talib import numpy as np import EsTalib from EsSeries import NumericSeries# 策略參數字典 g_params[p1] 5 g_params[p2] 10 g_params[p3] 120 g_params[ZQ] 5 #交易周期…

Qt 程序獲取程序所在路徑、用戶目錄路徑、臨時文件夾等特殊路徑的方法

Qt 程序獲取程序所在路徑、用戶目錄路徑、臨時文件夾等特殊路徑的方法 經常我們的程序中需要訪問一些特殊的路徑,比如程序所在的路徑、用戶目錄路徑、臨時文件夾等。在 Qt 中實現這幾個功能所用的方法雖然都不難,但是各不相同,每次用到時還要…

搞了個30天學習量化的數據資料,可以bt做全球。數據鏈接白送

待會上傳代碼,資料,打包好了,拿來就能用。累死我了,搞了兩天,必須收費,絕不允許白嫖。不然對不起我熬夜,那么辛苦。 確定后,掃描百度網盤 鏈接:https://pan.baidu.com/s/1C0k6zkjHchFVQaHe4nRMsg?pwd=kkgb 提取碼:kkgb 如何回測k線圖 如何根據形態選股

解決 springboot + JPA + MySQL 表名全大寫 出現 “表不存在” 問題(Table ‘XXX.xxx‘ doesn‘t exist)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 項目中使用 JPA 和 mysql 。表名是全大寫的。 出現 如下報錯: java.sql.SQLSyntaxErrorException: Table XXX_ms.work_tas…

自學Linux命令的四種方法

本文由 極客范 - 小道空空 翻譯自 Danny Stieben。歡迎加入極客翻譯小組,同我們一道翻譯與分享。轉載請參見文章末尾處的要求。如果你想成為Linux高手,那么掌握一些Linux命令是必不可少的。下面是自學Linux命令的四種方法。 每日提示 學習Linux命令的…

第五周學習總結

第六章: 主要內容: 1.接口 2.實現接口 3.理解接口 4.接口回調 5.接口與多態 6.接口變量做參數 7.面向接口編程 Example6_1: Example6_2: Example6_3: Example6_4: Example6_5: Example6_6: 總結:這章節沒有較大問題,例題也都做了一遍。蠻順利…

Android 設備的CPU類型(通常稱為”ABIs”)

armeabiv-v7a: 第7代及以上的 ARM 處理器。2011年15月以后的生產的大部分Android設備都使用它.arm64-v8a: 第8代、64位ARM處理器,很少設備,三星 Galaxy S6是其中之一。armeabi: 第5代、第6代的ARM處理器,早期的手機用的比較多。x86: 平板、模…

國信證券學習系列(1)

軟件不錯,滿足了我對股票,期貨,期權的全部要求。而且數據可以提供下載,簡直沒話說了。 數據清洗問題,我其實很早以前就在思考這個問題,回測,到底在測什么?什么樣的數據可以用來回測&…

JNA—JNI終結者

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1.介紹 給大家介紹一個最新的訪問本機代碼的Java框架—JNA。 JNA(Java Native Access)框架是一個開源的Java框架,是SUN公司…

FIFO存儲器

FIFO( First Input First Output)簡單說就是指先進先出。由于微電子技術的飛速發展,新一代FIFO芯片容量越來越大,體積越來越小,價格越來越便宜。作為一種新型大規模集成電路,FIFO芯片以其靈活、方便、高效的特性,逐漸在…

通過8個技巧讓你成為一個超強的Linux終端用戶

本文由 極客范 - minejo 翻譯自 Chris Hoffman。歡迎加入極客翻譯小組,同我們一道翻譯與分享。轉載請參見文章末尾處的要求。使用Linux終端不僅僅是只輸入命令。學習這些基本的技巧,你就會逐漸掌握Bash shell,這個在大多數Linux發行版上默認…

國信證券學習系列(2)

獲取指數池: def init(ContextInfo):#設置股票池stock300 ContextInfo.get_stock_list_in_sector(滬深300)ContextInfo.stock300_weight {}stock300_symbol []stock300_weightlist [] ContextInfo.index_code ContextInfo.stockcode"."ContextInfo.m…

旅游服務商Bikego完成A輪融資,共建創投、馬蜂窩投資

2月26日消息,近日Bikego宣布完成A輪融資,共建創投、北京馬蜂窩之旅國際旅行社投資。目前金額尚未公開。 bikego領趣旅行成立于2016年,是一家目的地日游服務運營商。從內容切入,提供國內自由行客戶的白天玩法解決方案,…

python-flask-1

https://askubuntu.com/questions/244641/how-to-set-up-and-use-a-virtual-python-environment-in-ubuntu 1. virtualenv安裝 sudo apt-get install virtualenv sudo apt install virtualenvwrapper echo "source /usr/share/virtualenvwrapper/virtualenvwrapper.sh&quo…

JSch:Java Secure Channel -- java 代碼實現 ssh 遠程操作

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 JSch 是SSH2的一個純Java實現。 它允許你連接到一個 sshd 服務器,使用端口轉發,X11轉發,文件傳輸等…