git版本控制工具(二)----本地版本庫的經常使用操做

【聲明】 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這個文件在工做區的修改所有撤銷。

這裏有兩種狀況:

  • 一種是readme.txt自修改後尚未被放到暫存區,如今,撤銷修改就回到和版本庫如出一轍的狀態;
  • 一種是readme.txt已經添加到暫存區後,又做了修改,如今,撤銷修改就回到添加到暫存區後的狀態。

一句話總結,即:用暫存區中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。又能夠輸入一樣的命令回到版本三了。

如今咱們能夠作一個總結了:

  • HEAD指向的版本就是當前版本,所以,Git容許咱們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
  • 穿梭前,用git log能夠查看有哪些版本,以便肯定要回退到哪一個版本
  • 要重返將來,用git reflog查看命令歷史,以便肯定要回到將來的哪一個版本

 

5、工做區和暫存區的概念:

Git和其餘版本控制系統如SVN的一個不一樣之處就是有暫存區的概念。

  • 工做區(Working Directory):就是你在電腦裏能看到的目錄;
  • 版本庫(Repository):工做區有一個隱藏目錄「.git」,這個不算工做區,而是Git的版本庫

Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD。

注:分支和HEAD的概念稍後再說。

咱們把文件往Git版本庫裏添加的時候,是分兩步執行的:

  • 第一步是用「git add」把文件添加進去,實際上就是把文件修改添加到暫存區
  • 第二步是用「git commit」提交更改,實際上就是把暫存區的全部內容提交到當前分支

由於咱們建立Git版本庫時,Git自動爲咱們建立了惟一一個master分支,因此,如今,commit就是往master分支上提交更改。能夠簡單理解爲,須要提交的文件修改統統放到暫存區,而後,一次性提交暫存區的全部修改。一旦提交後,若是你又沒有對工做區作任何修改,那麼工做區就是「乾淨」的。即:nothing to commit (working directory clean)。

注:用「git diff HEAD -- filename」命令能夠查看工做區和暫存區裏面最新版本的區別。

關於遠程倉庫的使用,咱們將在下一章節中進行講解。

 

本文參考連接:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743858312764dca7ad6d0754f76aa562e3789478044000

相關文章
相關標籤/搜索