【聲明】 html
歡迎轉載,但請保留文章原始出處→_→ android
生命壹號:http://www.cnblogs.com/smyhvae/ git
文章來源:http://www.cnblogs.com/smyhvae/p/3994704.html分佈式
【正文】工具
在上一章節中,咱們學習了關於Git最基本的用法,包括安裝Git、建立版本庫,以及提交本地代碼。本章節中將學習更多的使用技巧。即:Git版本控制工具(一)----git的安裝及建立版本庫佈局
咱們先要作好準備工做,將某個項目建立版本庫,我這裏就新建一個Android項目GitTest,建立一個版本庫。打開Git Bash,進入到這個項目的根目錄下,而後執行git init命令,以下圖所示:學習
這樣,準備工做就作好了。編碼
1、忽略文件:spa
版本庫已經建立好了,接下來咱們須要提交項目中的代碼,可是不是全部的文件都須要加入到版本控制當中去呢?命令行
咱們須要知道,在Android項目結構中,bin目錄和gen下的文件都是自動生成的,咱們不該該將這部分文件添加到版本控制當中,不然有可能會對文件的自動生成形成影響。那如何才能實現這樣的效果呢?
其實,Git會檢查版本庫中的根目錄下是否存在一個名爲.gitignore的文件,若是存在的話,就去一行一行的讀取這個文件中的內容,並把每一行指定的文件或目錄排除在版本控制以外。注意,.gitignore的文件中指定的文件或者目錄是可使用「*」通配符的。
【步驟】
如今,咱們在GitTest項目的根目錄下建立一個名爲.gitignore的文件,而後去編輯這個文件中的內容。以下圖所示:
這樣就把bin目錄和gen下的文件都忽略掉,從而使它們不會加入到版本控制中。
記住,.gitignore文件的編碼方式必須爲UTF-8:
而後就可使用add提交代碼:
git add .
而後執行commit命令完成提交:
git commit -m "First commit"
注:之後每次修改忽略文件以後,或者從新添加了文件,都必須從新提交,文件纔會生效。
問:若是某個文件被加入到忽略文件中,即便被修改了內容,經過git status 和git diff也仍是可以看到的修改記錄,這是爲何呢?是忽略文件無效嗎?
2、查看修改的內容:(未提交以前)
Git比其餘版本控制系統設計得優秀,由於Git跟蹤並管理的是修改,而非文件。
在進行一次代碼提交以後,咱們後面還須要對項目不斷地進行維護,添加新功能。理想的狀況是:每完成一小塊功能,就執行一次提交。Git會記住每一次提交的狀態。
注:這裏能查看到的修改內容是指提交以前的修改。若是你已經提交了,立刻再輸入這個命令,就看不到修改的內容了。
一、查看被修改的文件:git status
查看文件修改的狀況的方法很是簡單,只需在根目錄執行以下命令:
git status
而後Git會提示目前項目中沒有任何可提交的文件,由於咱們纔剛剛提交過。如今咱們在佈局文件中,添加一個Button,添加的代碼以下:
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="第一個按鈕" />
而後再輸入git status看一下:
git status命令可讓咱們時刻掌握倉庫當前的狀態,上面的命令告訴咱們,activity_main.xml被修改過了,但這還只是沒有提交的修改。
二、查看文件的具體修改內容:git diff
以前的git status命令能夠查看被修改的文件是什麼,若是要查看具體的修改內容,須要輸入以下命令:
git diff
執行結果以下:
git diff顧名思義就是查看difference,顯示的格式正是Unix通用的diff格式。
若是隻想查看activity_main.xml這個文件的更改內容,可使用以下命令:
git diff res/layout/activity_main.xml
執行結果以下:
三、撤銷未add的修改:git checkout
只要代碼未提交,全部修改的內容都是能夠撤銷的。能夠執行git checkout這個命令。即執行以下命令:
git checkout -- res/layout/activity_main.xml
執行以後,咱們對activity_main.xml這個文件在add以前所作的所有修改都被撤銷了。
從新運行git status命令檢查一下:
能夠看到,當前項目沒有任何能夠提交的文件,撤銷成功。
四、撤銷未commit的修改:git reset和git checkout
不過上面這種方式只適用於尚未執行過add命令的文件,若是某個文件已經被add過了,這種方式是無效的。
此時應該採起的步驟是:先使用reset命令取消add添加(此時暫存區中的內容將被清空,以前全部的add都是無效的),再使用checkout命令將修改的內容進行撤銷。即執行以下命令:
git reset HEAD res/layout/activity_main.xml
git checkout -- res/layout/activity_main.xml
【總結】
命令git checkout -- filename意思就是,把filename這個文件在工做區的修改所有撤銷。
這裏有兩種狀況:
一句話總結,即:用暫存區中filename文件來覆蓋工做區中的filename文件。
注:git checkout -- file命令中的「--」很重要,沒有「--」,就變成了「建立一個新分支」的命令,咱們在後面的分支管理中會再次遇到git checkout命令。
五、刪除文件:
當你直接在在文件管理器中把沒用的文件(這裏以忽略文件爲例)刪了,這個時候,Git知道你刪除了文件,所以,工做區和版本庫就不一致了,git status命令會馬上告訴你哪些文件被刪除了:
如今你有兩個選擇,一是確實要從版本庫中刪除該文件,那就用命令git rm刪掉,而且commit:
git rm .gitignore git commit -m "delete .gitignore"
另外一種狀況是刪錯了,如今不想刪除,由於版本庫裏還有呢,因此能夠很輕鬆地把誤刪的文件恢復到最新版本:
git checkout -- .gitignore
注:git checkout實際上是用版本庫裏的版本(準確來講是暫存區的版本)替換工做區的版本,不管工做區是修改仍是刪除,均可以「一鍵還原」。
3、查看提交記錄:(log命令)
每當你以爲文件修改到必定程度的時候,就能夠「保存一個快照」,這個快照在Git中被稱爲commit。一旦你把文件改亂了,或者誤刪了文件,還能夠從最近的一個commit恢復,而後繼續工做,而不是把幾個月的工做成果所有丟失。
當某個項目開發了幾個月以後,咱們可能已經執行過上百次的提交操做了。這個時候估計你早就忘記了每次提交都修改了哪些內容。不過不要緊,Git一直都幫咱們記錄着呢。
咱們如今將以前的修改進行提交:
git add . git commit -m "add button1"
而後執行以下命令查看提交記錄:
git log
執行的結果以下:
能夠看到,每次提交都會包含提交id,提交人,提交日期,以及提交描述這四個信息。
你看到的一大串相似「 3628164...882e1e0」的是commit id(版本號),和SVN不同,Git的commit id不是1,2,3……遞增的數字,而是一個SHA1計算出來的一個很是大的數字,用十六進制表示,並且你看到的commit id和個人確定不同,以你本身的爲準。爲何commit id須要用這麼一大串數字表示呢?由於Git是分佈式的版本控制系統,後面咱們還要好幾我的在同一個版本庫裏工做,若是你們都用1,2,3……做爲版本號,那確定就衝突了。
當提交記錄很是多的時候,咱們只想查看其中的某條記錄,能夠在該log命令的後面加上對應記錄的id,並加上-l參數。即:git log [id] -l
而若是想要查看這條記錄提交記錄的具體修改了什麼內容,能夠繼續加上-p參數。即:git log [id] -l -p
4、版本回退:
咱們如今進行第二次修改,也就是說,在佈局文件中添加一個按鈕button2,而後執行git log命令,顯示效果以下:
上圖顯示,咱們總共進行了三次提交。
每提交一個新版本,實際上Git就會把它們自動串成一條時間線。執行以下命令進入可視化界面:
gitk
執行後彈出以下界面:
如今開始咱們的版本回退工做。
首先,Git必須知道當前版本是哪一個版本,在Git中,用HEAD表示當前版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^,固然往上100個版本寫100個^比較麻煩,因此寫成HEAD~100。
【新版本回到舊版本】
如今,咱們從「版本3」回退到上一個版本,即回退到「版本2」,就可使用git reset命令:
git reset --hard HEAD^
執行效果以下:
--hard參數有啥意義?這個後面再講,暫時先放心使用。
再執行git log命令,發現版本三已經不見了:
【舊版本回到新版本】
若是如今要從「版本2」回到「版本3」,該怎麼辦呢?辦法其實仍是有的。
只要上面的命令行窗口尚未被關掉,就能夠順着往上找,只要找到版本3的id號就好了,即輸入以下命令:
git reset --hard 508972a
版本號不必寫全,寫前7位就能夠了,Git會自動去找。
若是你想回退到某個版本,可是電腦已經關閉了,這個時候已經找不到新版本的commit id了,該怎麼辦呢?辦法老是有的。Git提供了一個命令git reflog用來記錄你的每一次命令。即輸入以下命令:
git reflog
因而,咱們終於找到了版本三的commit id。又能夠輸入一樣的命令回到版本三了。
如今咱們能夠作一個總結了:
5、工做區和暫存區的概念:
Git和其餘版本控制系統如SVN的一個不一樣之處就是有暫存區的概念。
Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD。
注:分支和HEAD的概念稍後再說。
咱們把文件往Git版本庫裏添加的時候,是分兩步執行的:
由於咱們建立Git版本庫時,Git自動爲咱們建立了惟一一個master分支,因此,如今,commit就是往master分支上提交更改。能夠簡單理解爲,須要提交的文件修改統統放到暫存區,而後,一次性提交暫存區的全部修改。一旦提交後,若是你又沒有對工做區作任何修改,那麼工做區就是「乾淨」的。即:nothing to commit (working directory clean)。
注:用「git diff HEAD -- filename」命令能夠查看工做區和暫存區裏面最新版本的區別。
關於遠程倉庫的使用,咱們將在下一章節中進行講解。