git是目前世界上最早進的分佈式版本控制系統。git
Linus在1991年建立了開源的Linux,今後,Linux系統不斷髮展,已經成爲最大的服務器系統軟件了。Linus雖然建立了Linux,但Linux的壯大是靠全世界熱心的志願者參與的,這麼多人在世界各地爲Linux編寫代碼,那Linux的代碼是如何管理的呢?事實是,在2002年之前,世界各地的志願者把源代碼文件經過diff的方式發給Linus,而後由Linus本人經過手工方式合併代碼!緩存
你也許會想,爲何Linus不把Linux代碼放到版本控制系統裏呢?不是有CVS、SVN這些免費的版本控制系統嗎?由於Linus堅決地反對CVS和SVN,這些集中式的版本控制系統不但速度慢,並且必須聯網才能使用。有一些商用的版本控制系統,雖然比CVS、SVN好用,但那是付費的,和Linux的開源精神不符。不過,到了2002年,Linux系統已經發展了十年了,代碼庫之大讓Linus很難繼續經過手工方式管理了,社區的弟兄們也對這種方式表達了強烈不滿,因而Linus選擇了一個商業的版本控制系統BitKeeper,BitKeeper的東家BitMover公司出於人道主義精神,受權Linux社區無償使用這個版本控制系統。安定團結的大好局面在2005年就被打破了,緣由是Linux社區牛人彙集,難免沾染了一些梁山好漢的江湖習氣。開發Samba的Andrew試圖破解BitKeeper的協議(這麼幹的其實也不僅他一個),被BitMover公司發現了(監控工做作得不錯!),因而BitMover公司怒了,要收回Linux社區的無償使用權。Linus能夠向BitMover公司道個歉,保證之後嚴格管教弟兄們,嗯,這是不可能的。服務器
實際狀況是這樣的:Linus花了兩週時間本身用C寫了一個分佈式版本控制系統,這就是Git!一個月以內,Linux系統的源碼已經由Git管理了!牛是怎麼定義的呢?你們能夠體會一下。Git迅速成爲最流行的分佈式版本控制系統,尤爲是2008年,GitHub網站上線了,它爲開源項目免費提供Git存儲,無數開源項目開始遷移至GitHub,包括jQuery,PHP,Ruby等等。歷史就是這麼偶然,若是不是當年BitMover公司威脅Linux社區,可能如今咱們就沒有免費而超級好用的Git了。分佈式
(此種安裝的1.8,版本太老,能夠學習用,生成環境建議用第二種方式):ide
 學習
 網站
(3)安裝成功後,運行以下命令:3d
 版本控制
新建目錄git_test,在git_test目錄下建立一個版本庫,命令:git init指針

能夠看到在git_test目錄下建立了一個.git隱藏目錄,這就是版本庫目錄。
① 在版本庫中建立文件的時候,就有了文件的第一個版本,於此同時會生成一個指針指向這個版本

② 當修改了code.txt中的內容之後,就生成了第二個版本,可是這個版本是依賴上一個版本的,在這個版本中僅僅會記錄文件發生了那些修改。在有了一個新版本以後,這個指針會指向最新的版本。

③ 經過修改指針的位置能夠實現回退到某個版本,表示方式有兩種,一種是用^,一種使用~,以下
l HEAD^ 或者 HEAD~1:表示上一個版本
l HEAD^^ 或者 HEAD~2:表示上兩個版本
經過上面的方式回退到第一個版本以後,指針就指向了版本1

(1) 在git_test目錄下建立一個文件code.txt,寫入一行內容以下:

(2) 使用以下兩條命令能夠建立一個版本,建立版本須要兩步:
① git add code.txt
② git commit –m '版本1'

(3) 查看版本記錄,命令是git log:

(4) 繼續編輯code.txt,在裏面增長一行。

(5) 使用以下命令再建立一個版本並查看版本記錄:


(6) 如今若想回到某一個版本,可使用以下命令:
git reset --hard HEAD^
其中HEAD表示當前最新版本,HEAD^表示當前版本的前一個版本,HEAD^^表示當前版本的前前個版本,也可使用HEAD~1表示當前版本的前一個版本,HEAD~100表示當前版本的前100版本。
如今若以爲想回到版本1,可使用以下命令:



執行命令後使用git log查看版本記錄,發現如今只能看到版本1的記錄,cat code.txt查看文件內容,如今只有一行,也就是第一個版本中code.txt的內容。
(7) 假如咱們如今又想回到版本2,這個時候怎麼辦?
可使用以下命令:
git reset --hard 版本號
從上面能夠看到版本2的版本號爲:

(8) 根據查詢到的序號進行版本選擇:


如今發現版本2有回來了。能夠cat code.txt查看其裏面的內容以下:
(9) 假如說上面的終端已經關了改怎麼回退版本。
咱們在執行以下命令將版本回退到版本1。

下面把終端關了,而後再打開終端,發現以前版本2的版本號看不到了。

那麼怎麼再回到版本2呢?git reflog命令能夠查看咱們的操做記錄。

能夠看到版本2的版本號,咱們再使用以下命令進行版本回退,版本從新回到了版本2。

電腦中的目錄,好比咱們的git_test,就是一個工做區。
l 工做區有一個隱藏目錄.git,這個不是工做區,而是git的版本庫。
l git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD。
l 由於咱們建立git版本庫時,git自動爲咱們建立了惟一一個master分支,因此,如今,git commit就是往master分支上提交更改。
l 你能夠簡單理解爲,須要提交的文件修改統統放到暫存區,而後,一次性提交暫存區的全部修改。

前面講了咱們把文件往git版本庫裏添加的時候,是分兩步執行的:
第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;
第二步是用git commit提交更改,實際上就是把暫存區的全部內容提交到當前分支。
(1) 下面在git_test目錄下再建立一文件code2.txt,而後編輯內容以下:


(2) 而後再次編輯code.txt內容,在其中加入一行,編輯後內容以下:

(3) 使用以下命令查看當前工做樹的狀態:
git status

上面提示咱們code.txt被修改,而code2.txt沒有被跟蹤。
(4) 咱們使用以下命令把code.txt和code2.txt加入到暫存區,而後再執行git status命令,結果以下:

全部git add命令是把全部提交的修改存放到暫存區。
(5) 而後,執行git commit就能夠一次性把暫存區的全部修改提交到分支建立一個版本。


(6) 一旦提交後,若是你又沒有對工做區作任何修改,那麼工做區就是「乾淨」的。執行以下命令能夠發現:

git管理的文件的修改,它只會提交暫存區的修改來建立版本。
(1) 編輯code.txt,並使用git add 命令將其添加到暫存區中。


添加到緩存區

再添加一行

(2) git commit建立一個版本,

此時並使用git status查看,發現狀態不是clean

這是由於第二次修改code.txt內容以後,並無將其添加的工做區,因此建立版本的時候並無被提交。
(1) 繼續上面的操做,提示咱們可使用格式來撤銷操做,也就是丟棄工做區中你的修改:
git checkout -- <文件>
執行以下命令,

發現工做區乾淨了,

第二次的改動內容也沒了。

(1) 前面所演示的是還沒有添加到暫存區中的內容進行回滾,其實,即便加入到了暫存區,也是開始能夠回滾的。
咱們繼續編輯code.txt,並在其中添加以下內容 

並將其添加的暫存區

(3)git一樣告訴咱們,用命令git reset [選項] HEAD file能夠把暫存區的修改撤銷掉,從新放回工做區。
選項有三個
l --hard:緩存區和工做目錄中的內容都回滾到指定的那個版本狀態
l --mixed:默認選項,緩存區和你指定的提交同步,可是工做目錄不受影響
l --soft:緩存區和工做目錄中的內容都不變(僅僅庫中的內容回滾的指定版本)
l 使用這些選項的時候,就不能再指定具體的文件了

狀態

到這裏,僅僅是保存在將暫存區中的內容刪除了,接下來就能夠將這個文件回滾到修改以前的狀態
(4)如今若想丟棄code.txt的修改,執行以下命令便可。


如今,若是你不但改錯了東西,還從暫存區提交到了版本庫,則須要進行版本回退。
小結:
l 場景1:當你改亂了工做區某個文件的內容,想直接丟棄工做區的修改時,用命令git checkout -- file。
l 場景2:當你不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操做。
l 場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節。
來演示三個選項的做用
先來演示hard選項
1 在版本庫中編輯一個文件1,並add到暫存區

2 編輯另外一個文件(不保存到暫存區)

3 查看狀態,一個在暫存區 一個是未追蹤狀態

4 用git reset --hard xxxx 回滾到一個狀態

5 再次查看狀態(此時發現是clean,什麼狀態的都沒有了)

6 這兩個文件中新添加的內容都沒了

先來演示soft選項
前面部分略
1 執行 reset,回滾到第一個版本

2 此時暫存區和文件中的內容都還在

3 查看當前所處的版本,已經回到了第一個版本,其餘的版本都沒了

對比工做區和某個版本中文件的不一樣:
(1) 繼續編輯文件code.txt,在其中添加一行內容。

(2) 如今要對比工做區中code.txt和上個版本中code.txt的不一樣。使用以下命令:

咱們也能夠和版本庫中的第二個版本作比對

對比兩個版本間文件的不一樣:
(1) 如今要對比HEAD和HEAD^版本中code.txt的不一樣,使用以下命令:

(1) 咱們把目錄中的code2.txt刪除。

這個時候,git知道刪除了文件,所以,工做區和版本庫就不一致了,git status命令會馬上提示哪些文件被刪除了。

(2) 如今你有兩個選擇,一是確實要從版本庫中刪除該文件,那就用命令git rm刪掉,而且git commit:



另外一種狀況是刪錯了,能夠直接使用git checkout – code2.txt,這樣文件code2.txt又回來了。
小結: