手把手教你玩轉Git分布式版本控制系統!


目錄

 

  1. Git誕生歷史 

  2. Git環境准備

  3. Git安裝部署

  4. Git常用命令

  5. Git基本操作

  6. Git管理分支結構

  7. Git管理標簽

  8. GitLab安裝部署

  9. GitHub托管服務

  10. Git客戶端工具

 

1

Git誕生歷史

 

我 想大家還記得Linus torvalds在1991年時發布了Linux操作系統吧,從那以后Linux系統變不斷發展壯大,因為Linux系統開源的特性,所以一直接受着來自 全球Linux技術愛好者的貢獻,志願者們通過郵件向Linus發送着自己編寫的源代碼文件,然后由Linus本人通過手工的方式將代碼合並,但這樣不僅 沒有效率,而且真的是太痛苦了。


一 直到2002年,Linux系統經過十余年的不斷發展,代碼庫已經龐大到無法再讓Linus通過手工的方式管理了,但是Linus真的很不喜歡CVS或者 Subversion版本控制系統,於是商業公司BitMover決定將其公司的BitKeeper分布式版本控制系統授權給Linux開發社區來免費使 用,當時的BitKeeper可以比較文件內容的不同,還能夠將出錯的文檔還原到歷史某個狀態,Linus終於放下了心里的石頭。

 

分布式版本控制流程圖

 

CVS和Subversion屬於傳統的版本控制系統,而分布式版本控制系統最大的特點是不需要每次提交都把文件推送到版本控制服務器,而是采用分布式版本庫的機制,使得每個開發人員都夠從服務器中克隆一份完整的版本庫到自己計算機本地,不必再完全依賴於版本控制服務器,並且因為數據都在自己本地,不僅效率提高了,而且即便我們離開了網絡依然可以執行提交文件、查看歷史版本記錄、創建分支等等操作,真的是開發者的福音啊。

 

就 這樣平靜的度過了三年時間,但是Linux社區聚集着太多的黑客人物,2005年時,那位曾經開發Samba服務程序的Andrew因為試圖破解 BitKeeper軟件協議而激怒了BitMover公司,當即決定不再向Linux社區提供免費的軟件授權了,此時的Linus其實也早已有自己編寫分 布式版本控制系統的打算了,於是便用C語言花了2周創建了Git分布式版本控制系統,並上傳了Linux系統的源代碼。

 

git_logo

 

Git 不僅是一款開源的分布式版本控制系統,而且有其獨特的功能特性,例如大多數的分布式版本控制系統只會記錄每次文件的變化,說白了就是只會關心文件的內容變 化差異,而Git則是關注於文件數據整體的變化,直接會將文件提交時的數據保存成快照,而非僅記錄差異內容,並且使用SHA-1加密算法保證數據的完整 性。

 

Git為了提高效率,對於沒有被修改的文件,則不會重復存儲,而是創建一個鏈接指向之前存儲過的文件。

 

git提交流程圖

 

在正式使用前,我們還需要弄清楚Git的三種重要模式,分別是已提交、已修改、已暫存。

 

  • 已提交(committed):表示數據文件已經順利提交到Git數據庫中。

  • 已修改(modified):表示數據文件已經被修改,但未被保存到Git數據庫中。

  • 已暫存(staged):表示數據文件已經被修改,並會在下次提交時提交到Git數據庫中。

 

提交前的數據文件可能會被隨意修改或丟失,但只要把文件快照順利提交到Git數據庫中,那就可以完全放心了,流程為:

 

  1. 在工作目錄中修改數據文件。

  2. 將文件的快照放入暫存區域。

  3. 將暫存區域的文件快照提交到Git倉庫中。

 

 

git工作模式

 

2

Git環境准備

 

 

3

Git安裝部署

 

Git 是分布式的版本控制系統,我們只要有了一個原始Git版本倉庫,就可以讓其他主機克隆走這個原始版本倉庫,從而使得一個Git版本倉庫可以被同時分布到不 同的主機之上,並且每台主機的版本庫都是一樣的,沒有主次之分,極大的保證了數據安全性,並使得用戶能夠自主選擇向那個Git服務器推送文件了,其實部署 一個git服務器是非常簡單的。

 

 

4

Git常用命令

 

   add         #添加文件內容至索引

   bisect  #通過二分查找定位引入 bug 的變更

   branch     #列出、創建或刪除分支

   checkout   #檢出一個分支或路徑到工作區

   clone  #克隆一個版本庫到一個新目錄

   commit  #記錄變更到版本庫

   diff  #顯示提交之間、提交和工作區之間等的差異

   fetch  #從另外一個版本庫下載對象和引用

   grep  #輸出和模式匹配的行

   init  #創建一個空的 Git 版本庫或重新初始化一個已存在的版本庫

   log  #顯示提交日志

   merge  #合並兩個或更多開發歷史

   mv  #移動或重命名一個文件、目錄或符號鏈接

   pull  #獲取並合並另外的版本庫或一個本地分支

   push  #更新遠程引用和相關的對象

   rebase  #本地提交轉移至更新后的上游分支中

   reset  #重置當前HEAD到指定狀態

   rm  #從工作區和索引中刪除文件

   show  #顯示各種類型的對象

   status  #顯示工作區狀態

   tag  #創建、列出、刪除或校驗一個GPG簽名的 tag 對象

 

5

Git基本操作

 

5.1Git提交數據

 

我們可以簡單的把工作目錄理解成是一個被Git服務程序管理的目錄,Git會時刻的追蹤目錄內文件的改動,另外在安裝好了Git服務程序后,默認就會創建好了一個叫做master的分支,我們直接可以提交數據到了

 

 

5.2Git移除數據

 

有些時候會向把已經添加到暫存區的文件移除,但仍然希望文件在工作目錄中不丟失,換句話說,就是把文件從追蹤清單中刪除。

 

 

5.3Git移動數據

 

 

5.4Git歷史記錄

 

 

 

5.5Git還原數據

 

 

此時覺得寫得不妥,想還原某一次提交的文件快照

 

 

Git 服務程序中有一個叫做HEAD的版本指針,當用戶申請還原數據時,其實就是將HEAD指針指向到某個特定的提交版本,但是因為Git是分布式版本控制系 統,為了避免歷史記錄沖突,故使用了SHA-1計算出十六進制的哈希字串來區分每個提交版本,另外默認的HEAD版本指針會指向到最近的一次提交版本記 錄,而上一個提交版本會叫HEAD^,上上一個版本則會叫做HEAD^^,當然一般會用HEAD~5來表示往上數第五個提交版本。

 

 

剛剛的操作實際上就是改變了一下HEAD版本指針的位置,就是你將HEAD指針放在那里,那么你的當前工作版本就會定位在那里,要想把內容再還原到最新提交的版本,先看查看下提交版本號

 

 

怎么搞得?竟然沒有了Introduction software這個提交版本記錄?

 

原因很簡單,因為我們當前的工作版本是歷史的一個提交點,這個歷史提交點還沒有發生過Introduction software更新記錄,所以當然就看不到了,要是想“還原到未來”的歷史更新點,可以用git reflog命令來查看所有的歷史記錄:

 

 

如是只是想把某個文件內容還原,就不必這么麻煩,直接用git checkout命令就可以的,先寫一段話:

 

 

我們突然發現不應該寫一句話的,可以手工刪除(當內容比較多的時候會很麻煩),還可以將文件內容從暫存區中恢復:

 

 

這其中是有一套規則,如果暫存區中有該文件,則直接從暫存區恢復,如果暫存區沒有該文件,則將還原成最近一次文件提交時的快照。

 

6

Git管理分支結構

 

分 支即是平行空間,假設你在為某個手機系統研發拍照功能,代碼已經完成了80%,但如果將這不完整的代碼直接提交到git倉庫中,又有可能影響到其他人的工 作,此時我們便可以在該軟件的項目之上創建一個名叫“拍照功能”的分支,這種分支只會屬於你自己,而其他人看不到,等代碼編寫完成后再與原來的項目主分支 合並下即可,這樣即能保證代碼不丟失,又不影響其他人的工作。

 

 

一般在實際的項目開發中,我們要盡量保證master分支是非常穩定的,僅用於發布新版本,平時不要隨便直接修改里面的數據文件,而工作的時候則可以新建不同的工作分支,等到工作完成后在合並到master分支上面,所以團隊的合作分支看起來會像上面圖那樣。

 

生產代碼提交方式

 

6.1Git創建分支

 

 

6.2Git合並分支

 

現在,我們想把linux的工作成果合並到master分支上了,則可以使用”git merge”命令來將指定的的分支與當前分支合並:

 

git合並分之示意圖

 

 

6.3Git分支沖突

 

但是Git並不能每次都為我們自動的合並分支,當遇到了內容沖突比較復雜的情況,則必須手工將差異內容處理點,比如這樣的情況:

 

git分支沖突示意圖

 

 

#那么此時,我們在master與linux分支上都分別對中readme文件進行了修改並提交了,那這種情況下Git就沒法再為我們自動的快速合並了,它只能告訴我們readme文件的內容有沖突,需要手工處理沖突的內容后才能繼續合並:

 

 

7

Git管理標簽

 

當版本倉庫內的數據有個大的改善或者功能更新,我們經常會打一個類似於軟件版本號的標簽,這樣通過標簽就可以將版本庫中的某個歷史版本給記錄下來,方便我們隨時將特定歷史時期的數據取出來用,另外打標簽其實只是像某個歷史版本做了一個指針,所以一般都是瞬間完成的。

 

 

8

GitLab安裝部署

 

1. 安裝和配置必要的依賴關系Install and configure the necessary dependencies。

 

如果你安裝postfix發送郵件,請選擇“網站設置”中。而不是使用后綴也可以用郵件或 配置自定義SMTP服務器。如果你想使用的進出口,請 配置為SMTP服務器。

 

在CentOS7,下面的命令將在系統防火牆打開HTTP和SSH訪問。

 

 

2. 添加gitlab包服務器安裝包Add the GitLab package server and install the package

 

 

3. 配置並啟動gitlab Configure and start GitLab

 

4. 瀏覽到主機名和登錄Browse to the hostname and login

 

 

8.1GitLab配置ssh

 

gitlab搭配ssh默認端口引發的血戰

 

問題如下:

 

仔細發現故障情況

 

 

 

解決后效果,做一個對比,細心的朋友肯定能發現:gitlab和github其實pull和push是一樣的,所以我會在下面介紹如何用github來pull和push。

 

9

GitHub托管服務

 

Github 顧名思義是一個Git版本庫的托管服務,是目前全球最大的軟件倉庫,擁有上百萬的開發者用戶,也是軟件開發和尋找資源的最佳途徑,Github不僅可以托 管各種Git版本倉庫,還擁有了更美觀的Web界面,您的代碼文件可以被任何人克隆,使得開發者為開源項貢獻代碼變得更加容易,當然也可以付費購買私有 庫,這樣高性價比的私有庫真的是幫助到了很多團隊和企業。


大多數用戶都是為了尋找資源而愛上Github的,首先進入網站,點擊注冊(Sign up):

 

如果沒有注冊的朋友點擊注冊

 

填寫注冊信息

 

選擇倉庫類型,默認免費,點擊底下finish

sign up注冊

 

我們的GitHub賬號注冊完成

 

我們在向Github推送文件時,可以選擇SSH協議模式,在本機生成密鑰

 

 

點擊setting賬戶配置

 

點擊SSH keys

 

添加git服務器上生成的公鑰id_rsa.pub點擊Add  key添加

 

查看ssh公鑰信息

 

准備工作已經完畢,右上角點擊創建一個新的倉庫

 

填寫倉庫的信息

 

 

創建成功后會跳轉到該倉庫,選擇ssh模式,復制版本倉庫克隆地址

 

 

刷新一下web,果然看到版本倉庫已經同步了

 

10

Git客戶端工具

https://www.sourcetreeapp.com/

Git和Mercurial的Windows或Mac的客戶端

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM