一 git 簡介
1 歷史及由來
在 2002 年以前,世界各地的志願者把源代碼文件通過diff的方式發送給linus,然後由Linus本人通過手工方式合成代碼。但其工作量過於大,因爲代碼的數量已經很多了,於是Linus選擇了商用版的BitKeeper,BitKeeper的東家BitMover公司出於人道主義精神,授權Linux社區免費使用這個版本控制系統。
但大好局面在2005年就被打破了,原因是Linux社區牛人聚集,開發Samba的Andrew試圖破解BitKeeper的協議(這麼幹的其實也不只他一個),被BitMover公司發現了(監控工作做得不錯!),於是BitMover公司怒了,要收回Linux社區的免費使用權。
於是Linus花了兩週時間自己用C寫了一個分佈式版本控制系統,這就是Git!一個月之內,Linux系統的源碼已經由Git管理了!
Git迅速成爲最流行的分佈式版本控制系統,尤其是2008年,GitHub網站上線了,它爲開源項目免費提供Git存儲,無數開源項目開始遷移至GitHub,包括jQuery,PHP,Ruby等等。
2 分佈式和集中式
Linus 一直痛恨CVS和SVN 都是集中式的版本控制系統,而GIT 是分佈式版本控制系統
1 集中式
集中式版本控制系統:版本庫是集中存放在中央服務器的,而幹活的時候,用的都是自己的電腦,所以要先從中央服務器取得最新的版本,然後開始幹活,幹完活了,再把自己的活推送給中央服務器。中央服務器就好比是一個圖書館,你要改一本書,必須先從圖書館借出來,然後回到家自己改,改完了,再放回圖書館。
集中式版本控制系統最大的毛病就是必須聯網才能工作,如果在局域網內還好,帶寬夠大,速度夠快,可如果在互聯網上,遇到網速慢的話,可能提交一個10M的文件就需要5分鐘,這還不得把人給憋死啊。
2 分佈式
分佈式版本控制系統根本沒有“中央服務器”,每個人的電腦上都是一個完整的版本庫,這樣,你工作的時候,就不需要聯網了,因爲版本庫就在你自己的電腦上。既然每個人電腦上都有一個完整的版本庫,那多個人如何協作呢?比方說你在自己電腦上改了文件A,你的同事也在他的電腦上改了文件A,這時,你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
和集中式版本控制系統相比,分佈式版本控制系統的安全性要高很多,因爲每個人電腦裏都有完整的版本庫,某一個人的電腦壞掉了不要緊,隨便從其他人那裏複製一個就可以了。而集中式版本控制系統的中央服務器要是出了問題,所有人都沒法幹活了。
3 兩者比較
在實際使用分佈式版本控制系統的時候,其實很少在兩人之間的電腦上推送版本庫的修改,因爲可能你們倆不在一個局域網內,兩臺電腦互相訪問不了,也可能今天你的同事病了,他的電腦壓根沒有開機。因此,分佈式版本控制系統通常也有一臺充當“中央服務器”的電腦,但這個服務器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣幹活,只是交換修改不方便而已。
當然,Git的優勢不單是不必聯網這麼簡單,後面我們還會看到Git極其強大的分支管理,把SVN等遠遠拋在了後面。
CVS作爲最早的開源而且免費的集中式版本控制系統,直到現在還有不少人在用。由於CVS自身設計的問題,會造成提交文件不完整,版本庫莫名其妙損壞的情況。同樣是開源而且免費的SVN修正了CVS的一些穩定性問題,是目前用得最多的集中式版本庫控制系統。
除了免費的外,還有收費的集中式版本控制系統,比如IBM的ClearCase(以前是Rational公司的,被IBM收購了),特點是安裝比Windows還大,運行比蝸牛還慢,能用ClearCase的一般是世界500強,他們有個共同的特點是財大氣粗,或者人傻錢多。
微軟自己也有一個集中式版本控制系統叫VSS,集成在Visual Studio中。由於其反人類的設計,連微軟自己都不好意思用了。
分佈式版本控制系統除了Git以及促使Git誕生的BitKeeper外,還有類似Git的Mercurial和Bazaar等。這些分佈式版本控制系統各有特點,但最快、最簡單也最流行的依然是Git!
3 工作區和暫存區
1 工作區
如git 文件夾就是一個工作區
2 版本庫
工作區有一個隱藏目錄.git,這不算工作區,而是git的版本庫
git 的版本庫中存放了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有git 爲我們自動創建的第一個分支master,以及指向master 的一個指針叫HEAD
git add 實際是把文件添加到暫存區
git commanf是提交更改,將暫存區的內容提交到當前分支。
二 基本配置
1 建立版本庫
2 編寫文件,此文件一定要在git子目錄下,git add 用命令告訴git,將文件添加到git倉庫
git commit -m ** 及告訴git,將文件提交到倉庫
3 git 的相關操作及現象
?? 表示還沒提交到暫存區的數據
A 表示已經提交到暫存區,但沒有提交到當前分支
右邊M 表示在暫存區中修改了數據
左邊M表示數據已經提交了但是修改了並且提交到了暫存區
數據操作日誌的查看
數據定義版本並通過版本進行數據回滾。
數據的刪除
三 git 與 github 之間的操作
1 本地數據上傳
1 生成密鑰
2 創建一個目錄並將本地數據上傳至此目錄
2 在GitHub上創建目錄並下載至本地
1 創建目錄
2 下載至本地並查看