大家好,週一我們迎來了一個新的專題——git。
寫這個專題的初衷有兩點,第一點是覺得好像很少有公眾號提到git相關的技術,可能是覺得太基礎了看不上。但實際上git非常重要,在我們實際的開發工作當中使用的頻率也非常非常高。第二點是不少人git用的並不好,連同之前的我在內。而且用得不好也就算了,還意識不到它的重要性,所以就身體力行給大家開了這個專題,表達我的態度——git非常重要,不可以輕視。
Git歷史
首先提一下git的來源,git的作者是大名鼎鼎的Linus。有可能你沒有聽說過它,但是你一定聽說過他的作品。他寫了第一個版本的Linux核心,可以說Linux就是根據他的名字起的。大家公認的Linux之父。
Linus創造git的目的可能令很多人想不到,就是為了開發Linux核心。因為當時全世界各地都有開發者在為Linux核心提交程式碼。所有開發者的程式碼合併工作都是Linus一個人完成的,由於經常會遇到坑爹的開發者和坑爹程式碼,總靠人肉控制非常蛋疼。所以他們決定使用版本控制工具。
實際上當時已經有相對成熟的版本控制工具了,但是這些工具往往都是收費的。原本談好了免費提供給開源社群使用的,後來因為種種原因提供方收回了使用權。於是被逼無奈之下,Linus決定自己開發一款版本控制系統。據說他們只用了一週的時間就完成了核心程式碼的編寫,git就此誕生。
後來的故事大家應該都很熟悉了,由於git的簡單易用、免費(很關鍵)、執行效率很高,使得它突飛猛進,迅速流行了開來。甚至基於git誕生了開源社群github,實際上git並不是github專屬,幾乎所有的開源社群都使用git作為版本控制工具。雖然git和Linux取得了如此矚目的成功,但是它的作者Linus並沒有從中獲得多少收益,因為這些內容都是免費開源的。實際上Linus本身也是一個堅定的開源支持者,他對於開源社群的普及和建設也有著非常巨大的貢獻。
Linus是一個非常純粹得熱愛技術淡泊名利的人,大家感興趣可以去看看他寫的回憶錄,感受一下世界頂級大牛的成長曆程。
Git簡介
Git是版本控制工具這個眾所周知,那麼版本控制工具究竟可以用來做什麼事情呢?它底層的原理又是什麼呢?這一點大家可能就沒有那麼清楚了。
版本控制當中有兩個重要的內容, 一個是版本控制另外一個是多人協同。我們來設想兩個場景,第一個場景是我們之前開發了一個功能,結果程式碼寫著寫著發現這個功能沒有必要,於是我們果斷刪除了它。刪除了之後突然發現自己腦抽了,不該刪除的。這個時候我相信大多數人都會感嘆,要是當時存個檔該有多好啊。
版本控制就像是存檔功能,我們可以在我們想要的時候對檔案進行存檔。如果以後反悔了,還可以找回來。
第二個場景是多人協同,比如我們當前一個小組開發同一個專案,有人開發這個功能,有人開發那個功能。我們怎麼保證大家的程式碼統一呢?如果只是新增程式碼還好,如果是有人新增有人修改之前的程式碼呢?有人加了些臨時改動用來測試呢?顯然這會導致程式碼非常得亂,多人協同就是為了解決這個問題的。
Git可以使得大家各自在各自的分支進行程式碼開發和維護,彼此之間互不影響。等開發測試完成之後,再合併到一起。說起來簡單,但是我們稍微想一下就會發現一些問題。比如多人協同和版本控制耦合在一起之後,使用難度會大大增加。比如說我們當下要回到某個分支的某個歷史版本,再比如我們合併了之後發現合併錯版本了,比如我們發現提交錯內容了,等等等等。
Git的基本使用人人都會,關鍵在於當我們面臨這些疑難雜症的時候,是否能流暢得寫出命令來fix它們。
Git原理淺談
其實市面上的版本控制工具很多,我知道的就有好幾個,比如Google開發的hg,比如SVN等等。雖然這些工具有很多,但是它們的一些底層原理還是不太一樣的。如果是這樣,Git也不會如此為人稱道。
直接記錄快照
和Git不同,很多其他的版本控制工具在面臨檔案改動的時候,記錄的是檔案的具體改動。比如某個檔案增加了一行還是減去了一行,修改的內容是什麼。比如在下圖當中,version2改動了file A和fileC各一行,version只改動了file C兩行。每個版本只記錄這些檔案的改動。
而Git與他們不同,Git記錄的並不是檔案當中內容的改動,而是直接將發生變更的檔案記錄一個快照(snapshot)。這個詞經常在各種技術相關的文件當中出現,我們可以理解成存檔。也就是說把每一個發生過變動的檔案都存一份新的存檔。
比如下圖當中,在version 2當中,檔案A和C發生了改動,於是記錄改動之後的檔案快照A1和C1。對於version 3來說檔案A沒有再次改動,所以繼續保持A1。
這樣做看似額外多儲存了內容,增加了儲存成本,但是好處是巨大的。因為對於任何一個版本來說,它記錄的檔案內容都是全的,我們可以迅速還原出每一個分支對應的每一個版本的內容。並且還引發出了許多強大的功能。
可撤銷
Git一個非常巨大的特點就是幾乎所有提交快照的操作都是可撤銷的,也就是說我們不用擔心我們的誤操作或者是一時手殘毀掉整個專案或者是程式碼。Git會記錄下我們的每一次改動,即使是像是刪除這樣的操作,也會記錄下來。
當我們遇到一些複雜的問題的時候,這個特性顯得非常關鍵。因為當我們嘗試的時候我們並不一定確定能夠解決問題,如果我們解決不了,我們會希望回到嘗試之前的狀態。無論這中間經過了多少操作,我們都可以通過查閱Git的變更記錄找到之前開始嘗試的位置,從而還原所有的改動。
本地操作
Git另外一個巨大的好處是大多數的操作可以本地進行,這也是分散式檔案系統的特點。每一個節點都有幾乎完整的資料,我們在本地就可以查閱到最後一次同步之前所有的資訊。我們要回滾程式碼,或者是檢視之前的程式碼等操作在本地就可以直接完成。並不需要連線網路。
而對於有些工具來說,所有操作都需要通過網路進行,這就不是很友好了。尤其是在一些網路不好或者是沒有網路的場景當中。
以上介紹的這些內容既是Git的基本原理,也是Git強大功能的體現。當然這裡只是淺嘗輒止,在後續的文章當中,我們將會介紹它們的詳細使用。
今天的文章到這裡就結束了,如果喜歡本文的話,請來一波素質三連,給我一點支援吧(關注、轉發、點贊)。
- END -