點擊關注異步圖書,置頂公衆號git
天天與你分享 IT好書 技術乾貨 職場知識程序員
參與文末話題討論,每日贈送異步圖書。web
——異步小編算法
Git的背後有着一個很是精彩的成功故事。2005年4月,Linus Torvalds因不滿當時任何一個可用的開源版本控制系統,就親自着手實現了Git。shell
時至今日,若是咱們在Google中搜索「git version control」這幾個關鍵詞,都會看到數以百萬計的返回結果。Git已經儼然成爲了新型開源項目的一個標準。許多大型的開源項目都已經或正在計劃遷移到Git上來。Git算不算程序員的必備技能?答案是確定的。編程
站在巨人的肩膀上,咱們要特別感謝Linus Torvalds、Junio C. Hamano以及Git項目的衆多提交者,是他們給開發者社區帶來了這個奇妙的工具。安全
Git很是靈活。可爲多種不一樣的角色所用,從偶爾須要版本化少許shell腳本的單一系統管理員,到Linux內核項目中的上百個開發人員,一切皆有可能。固然,這種靈活性不是沒有代價的。在開始用Git來開展工做以前,你還必需要作一組決定。例如如下幾種。服務器
Git中當然已是分佈式版本庫。但你是真的打算只在本地工做,仍是更願意創建一箇中央版本庫?網絡
Git支持push和pull兩種數據傳輸類型,但咱們須要同時使用它們嗎?若是讓你選,你會選哪個?爲何不是另外一個?數據結構
分支與合併是Git中兩個強大的功能。可是,咱們應該開多少個分支呢?是根據每一個軟件功能來開?仍是針對每一個發行版來開?仍是隻該有一個分支?
爲了便於入門,下面咱們來總結一下工做流及其做用。
一些工做流可能並非目標問題惟一正確的解決方案,但它們是一個很好的起點,咱們能夠從中爲本身的項目開發出高效的工做流。
咱們之因此會重點介紹商業項目中敏捷開發團隊的工做,是由於咱們相信目前許多專業開發者(包括做者)都處於這樣的工做環境中。固然,這裏並不包括那些具備特殊要求的大型項目,由於這些項目一般有着很誇張的工做流,並且咱們相信這些也不是大多數開發者會感興趣的項目。另外,這裏也不包括那些開源項目的開發,雖然這些項目也能夠用Git規劃出一個頗有意思的工做流。
在具體探討分佈式版本控制的概念以前,讓咱們先來快速回顧一下傳統的集中式版本控制架構。
圖1.1中所顯示的就是一個集中式版本控制系統(例如CVS或Subversion)的典型佈局。每一個開發者都在他或她本身的計算機上有一個包含全部項目文件的工做目錄(即工做區)。當該開發者在本地作了修改以後,他或她就會按期將修改提交給某臺中央服務器。而後,開發者在執行更新操做的同時也會從該服務器上撿取出其餘開發者所作的修改。這臺中央服務器上存儲着這些文件(即版本庫)的當前版本和歷史版本。所以,這些被並行開發的分支,以及各類被命名(標記)的版本都將會被集中管理。
圖1.1 集中式版本控制
而在分佈式版本控制系統(見圖1.2)中,開發者環境與服務器環境之間是沒有分隔的。每個開發者都同時擁有一個用於當前文件操做的工做區與一個用於存儲該項目全部版本、分支以及標籤的本地版本庫(咱們稱其爲一份克隆)。每一個開發者的修改都會被載入成一次次的新版本提交(commit), 首先提交到其本地版本庫中。而後,其餘開發者就會當即看到新的版本。經過推送(push)和拉回(pull)命令,咱們能夠將這些修改從一個版本庫傳送到另外一個版本庫中。這樣一來,從技術上來看,這裏全部的版本庫在分佈式架構上的地位是同等的。所以從理論上來說,咱們再也不須要藉助服務器,就能夠將某一臺開發工做機上所作的全部修改直接傳送給另外一開發工做機。固然在具體實踐中,Git中的服務器版本庫也扮演了重要的角色,例如如下這些特型版本庫。
圖1.2 分佈式版本控制
下面,咱們再來看看分佈式系統相對於集中式的優勢有哪些。
其實,版本庫本質上就是一個高效的數據存儲結構而已,由如下部分組成。
文件(即blob):這裏既包含了文本也包含了二進制數據,這些數據將不以文件名的形式被保存。
目錄(即Tree):目錄中保存的是與文件名相關聯的內容,其中也會包含其餘目錄。
版本(即commit):每個版本所定義的都是相應目錄的某個可恢復的狀態。每當咱們建立一個新的版本時,其做者、時間、註釋以及其以前的版本都將會被保存下來。
對於全部的數據,它們都會被計算成一個十六進制散列值(例如像1632acb65b01 c6b621d6e1105205773931bb1a41這樣的值)。這個散列值將會被用做相關對象的引用,以及往後恢復數據時所需的鍵值(見圖1.3)。
圖1.3 版本庫中的對象存儲
也就是說,一個提交對象的散列值實際上就是它的「版本號」,若是咱們持有某一提交的散列值,就能夠用它來檢查對應版本是否存在於某一版本庫中。若是存在,咱們就能夠將其恢復到當前工做區相應的目錄中。若是該版本不存在,咱們也能夠從其餘版本庫中單獨導入(拉回)該提交所引用的所有對象。
接下來,咱們來看看採用這種散列值和這種既定的版本庫結構究竟有哪些優點。
對於大多數版本控制系統來講,分支的建立與合併一般會因其特殊性而被認爲是高級拓展操做。但因爲Git最初就是爲了方便那些散落在世界各地的Linux內核開發者而建立的,合併多方努力的結果一直都是其面臨的最大挑戰之一,因此Git的設計目標之一就是要讓分支的建立與合併操做變得儘量地簡單且安全。
在下面的圖1.4中,咱們向你展現了開發者是如何經過建立分支的方式來進行並行開發的。圖中的每個點都表明了該項目的一個版本(即commit)。而因爲在Git中,咱們只能對整個項目進行版本化,因此每一個點同時也表明了屬於同一版本的各個文件。
圖1.4 因開發者的並行開發而出現的分支建立操做
如上所示,圖中兩位開發者的起點是同一個版本。以後兩人各自作了修改,並提交了修改。這時候,對於這兩位開發者各自的版本庫來講,該項目已經有了兩個不一樣的版本。也就是說,他們在這裏建立了兩個分支。接下來,若是其中一個開發者想要導入另外一我的的修改,他/她就能夠用Git來進行版本合併。若是合併成功了,Git就會建立一個合併提交,其中會包含兩位開發者所作的修改。這時若是另外一位開發者也取回了這一提交,兩位開發者的項目就又回到了同一個版本。
在上面的例子中,分支的建立是非計劃性的,其緣由僅僅是兩個開發者在並行開發同一個軟件罷了。在Git中,咱們固然也能夠開啓有針對性的分支,即顯式地建立一個分支(見圖1.5)。顯式分支一般主要用於協調某一種功能性的並行開發。
圖1.5 針對不一樣任務的顯式分支
版本庫在執行拉回和推送操做時,能夠具體指定其針對的是哪一些分支。固然,除了這些簡單的分支建立和合並處理外,咱們也能夠對分支執行如下動做。
另外,若是你是一個繁忙的項目管理者,還在猶豫不決是否要採用Git
Jakub Narębski 著
點擊封面購買紙書
本書面向全部的Git用戶,全面細緻地向讀者介紹有關Git的各項實用技巧,充分發掘它的潛力,更好地實現項目版本管理。學習本書,能夠幫助讀者更好地運用Git,提高軟件開發效率。
本書做者Jakub Narębski自Git誕生之初就參與了Git的開發工做。他是gitweb子系統(Git原始Web界面)的主要貢獻者之一,是非官方的gitweb維護者。
【德】René Preißel(普萊貝爾), Bjørn Stachmann(斯拉赫曼) 著
點擊封面購買紙書
Git 是當今最流行的版本控制系統。本書並不偏重理論介紹,也不面面俱到,而是一本學習Git的實用指南。本書首先介紹了Git 的基礎知識,而後關注于敏捷開發,並給出工做流展現瞭解決現實問題所需的命令和選項。
【美】Jon Loeliger , Matthew McCullough 著
點擊封面購買紙書
市面上絕無僅有的Git圖書 全面剖析Git的用法 同時涵蓋GitHub
本書可讓讀者迅速上手Git,用它來跟蹤、分支、合併和管理代碼變動。本書經過一系列步驟式教程,引導讀者迅速掌握從Git基礎知識到高級使用技巧在內的全部知識,並提供友好而嚴謹的建議,以幫助讀者熟悉Git的許多功能。
本書在上一版的基礎之上進行了全面更新,包含了操做樹的技巧,全面覆蓋了reflog和stash的用法,還全面介紹了GitHub倉庫。一旦你掌握了Git系統的靈活性以後,你能夠以近乎無限的各類方式來管理代碼開發,而本書則會告訴你怎麼來作。
你用過Git嗎?截止時間4月29日17時,留言+轉發本活動到朋友圈,小編將抽獎選出5名讀者 贈送e讀版100元異步社區代金券一張,(留言點贊最多的自動得到一張)。
推薦閱讀
長按二維碼,能夠關注咱們喲
天天與你分享IT好文。
在「
點擊閱讀原文,直接購買《Git高手指南》