天天看點

Git指令行筆記

對一些指令行的整理,原文:http://blog.jobbole.com/25808/

樓樓自己的部落格:http://blog.csdn.net/taotao6039

1、取得項目的Git倉庫

1)在工作目錄中初始化新倉庫

$ git init

2)從現有倉庫克隆

$ git clone git://github.com/schacon/grit.git

這會再目前目錄下建立一個名為“grit”的目錄,其中包含一個.git目錄。

自定義目錄名稱:

$ git clone git://github.com/schacon/grit.git mygrit

2、記錄每次更新到倉庫

1)檢查目前檔案狀态

$ git status

# On branch master nothing to commit (working directory clean)

出現這句話說明你現在工作目錄相當幹淨。也就是說目前沒有任何任何跟蹤着的檔案,也沒有任何檔案在上次送出後更改過。

# Untracked files

表明該檔案出現在未跟蹤檔案清單中。Git不會自動将之納入跟蹤範圍。

2)跟蹤新檔案

$ git add README

此時再運作git status,會看到README檔案已被跟蹤,并處于暫存狀态。

【其實git add 的潛台詞就是把目标檔案快照放入暫存區域,也就是 add file into staged area,同時未曾跟蹤過的檔案标記為需要跟蹤。】

# Changes to be committed

說明該檔案已暫存。如果此時送出,那麼該檔案此時此刻的版本将被留存在曆史記錄中。

3)暫存已修改檔案

$ git status benchmarks.rb

# Changed but not updated

說明已跟蹤檔案的内容發生了變化,但還沒有放到暫存區。要暫存這次更新,需要運作git add 指令(這是個多功能指令,根據目标檔案的狀态不同,此指令的效果也不同:可以用它開始跟蹤新檔案,或者把已跟蹤的檔案放到暫存區,還能用于合并時把有沖突的檔案标記為已解決狀态等)。

下面我們運作git add将benchmarks.rb放到暫存區。

假設此時,我們需要在benchmarks.rb裡加一條注釋,重新編譯存盤後,運作git status看此刻狀态:

# Changes to be committed: #   (use "git reset HEAD ..." to unstage) # #   new file:   README #   modified:   benchmarks.rb # # Changed but not updated: #   (use "git add ..." to update what will be committed) # #   modified:   benchmarks.rb

我們可以看到benchmarks.rb檔案出現了兩次。一次算未暫存,一次已暫存。

實際上 Git 隻不過暫存了你運作 git add 指令時的版本,如果現在送出,那麼送出的是添加注釋前的版本,而非目前工作目錄中的版本。是以,運作了git add 之後又作了修訂的檔案,需要重新運作 git add 把最新版本重新暫存起來。

4)忽略某些檔案

我們可以建立一個名為.gitignore的檔案,列出了要忽略的檔案模式。

$ cat .gitignore *.[oa] *~

這行指令的意思是告訴Git忽略所有以.o或者.a結尾的檔案。一般這類對象檔案和存檔檔案都是編譯過程中出現的,我們用不着跟蹤它們的版本。第二行告訴 Git 忽略所有以波浪符(~)結尾的檔案,許多文本編輯軟體(比如 Emacs)都用這樣的檔案名儲存副本。

檔案 .gitignore 的格式規範如下: 

所有空行或者以注釋符号 # 開頭的行都會被 Git 忽略。可以使用标準的 glob 模式比對。比對模式最後跟反斜杠(/)說明要忽略的是目錄。 要忽略指定模式以外的檔案或目錄,可以在模式前加上驚歎号(!)取反。

所謂的 glob 模式是指 shell 所使用的簡化了的正規表達式:

星号(*)比對零個或多個任意字元;[abc] 比對任何一個列在方括号中的字元(這個例子要麼比對一個 a,要麼比對一個 b,要麼比對一個 c);問号(?)隻比對一個任意字元;如果在方括号中使用短劃線分隔兩個字元,表示所有在這兩個字元範圍内的都可以比對(比如[0-9] 表示比對所有 0 到 9 的數字)。

5)檢視已暫存和未暫存的更新

實際上git status的顯示比較簡單,僅僅是列出了修改過的檔案。

如果要檢視具體修改了什麼地方,可以用git diff指令。此指令比較的是工作目錄中目前檔案和暫存區域快照之間的差異,也就是修改之後還沒有暫存起來的變化内容。請注意,單單 git diff 不過是顯示還沒有暫存起來的改動,而不是這次工作和上次送出之間的差異。

若要看已經暫存起來的檔案,和上次送出時的快照之間的差異,可以用gif diff -- cached指令。(或者git diff -- staged)

6)送出更新

$ git commit

在送出的時候一定要用git status看看還有什麼檔案沒有git add過,否則送出的時候就不會記錄這些還沒有暫存起來的變化。

這種方式會啟動文本編輯器以便輸入本次送出的說明。預設為vim或者emacs。

另外可以使用-m 參數後跟送出說明的方式:

$ git commit -m"Story 182: Fix benchmarks for speed"

7)跳過使用暫存區域

覺得使用暫存區域比較繁瑣,可以跳過add步驟:

$ git commit -a -m "add new files."

8)移除檔案

$ git rm

要從git中移除某個檔案,就必須要從已跟蹤檔案清單中移除,也就是從暫存區域移除,然後送出。

如果隻是簡單地從工作目錄中手工删除檔案,運作 git status 時就會在 “Changed but not updated” 部分(也就是_未暫存_清單)看到。

另外一種情況是,我們想把檔案從 Git 倉庫中删除(亦即從暫存區域移除),但仍然希望保留在目前工作目錄中。換句話說,僅是從跟蹤清單中删除。比如一些大型日志檔案或者一堆.a 編譯檔案,不小心納入倉庫後,要移除跟蹤但不删除檔案,以便稍後在 .gitignore 檔案中補。

使用:$ git rm --cached README

又比如:$ git rm log/\*.log

9)重命名檔案

$ git mv file_from file_to

【fatal:當檔案未暫存,這條指令會提示錯誤,此檔案不在版本控制裡面。】

其實,運作 git mv 就相當于運作了下面三條指令:

$

mv

README.txt README 

$ git

rm

README.txt 

$ git add README

3、檢視送出曆史

1)檢視送出曆史

$ git log

預設不用任何參數的話,git log 會按送出時間列出所有的更新,最近的更新排在最上面。

2)log的選項

-p :展開每次送出的内容差異

-2:僅顯示最近兩次的更新

如:$ git log -p -2

--stat:僅顯示簡要的增/改行數統計

如:$ git log --stat

每個送出都列出了修改過的檔案,以及其中添加和移除的行數,并在最後列出所有增減行數小計。

--pretty:可以指定使用完全不同于預設格式的方式展示送出曆史

如:$ git log -pretty=oneline  将每一個送出放在一行顯示,主要顯示送出所寫的備注

$ git log -pretty=

format

:

"%h - %an, %ar : %s"

 可以定制要顯示的記錄格式,這樣的輸出便于後期變成提取分析

還有short,full,fuller,分别顯示不同容量的内容。

附format中常用占位符寫法及其意義:

%H 送出對象(commit)的完整哈希字串
%h 送出對象的簡短哈希字串
%T  樹對象(tree)的完整哈希字串
%t  樹對象的簡短哈希字串
%P  父對象(parent)的完整哈希字串
%p  父對象的簡短哈希字串
%an 作者(author)的名字
%ae 作者的電子郵件位址
%ad 作者修訂日期(可以用 -date= 選項定制格式)
%ar 作者修訂日期,按多久以前的方式顯示
%cn 送出者(committer)的名字
%ce 送出者的電子郵件位址
%cd送出日期
%cr 送出日期,按多久以前的方式顯示
%s  送出說明

3)限制輸出長度

除了定制輸出格式的選項之外,git log 還有許多非常實用的限制輸出長度的選項,也就是隻輸出部分送出資訊。之前我們已經看到過 -2 了,它隻顯示最近的兩條送出,實際上,這是 - 選項的寫法,其中的 n 可以是任何自然數,表示僅顯示最近的若幹條送出。不過實踐中我們是不太用這個選項的,Git 在輸出所有送出時會自動調用分頁程式(less),要看更早的更新隻需翻到下頁即可。

另外還有按照時間作限制的選項,比如 --since 和 --until

如:$ git log --since=2.weeks

你可以給出各種時間格式,比如說具體的某一天(“2008-01-15”),或者是多久以前(“2 years 1 day 3 minutes ago”)。

還可以給出若幹搜尋條件,列出符合的送出。用 --author 選項顯示指定作者的送出,用 --grep 選項搜尋送出說明中的關鍵字。(請注意,如果要得到同時滿足這兩個選項搜尋條件的送出,就必須用--all-match 選項。

如果隻關心某些檔案或者目錄的曆史送出,可以在 git log 選項的最後指定它們的路徑。因為是放在最後位置上的選項,是以用兩個短劃線(--)隔開之前的選項和後面限定的路徑名。

附其他常用選項:

-(n)    僅顯示最近的 n 條送出
--since, --after 僅顯示指定時間之後的送出。
--until, --before 僅顯示指定時間之前的送出。
--author 僅顯示指定作者相關的送出。
--committer 僅顯示指定送出者相關的送出。

4、撤銷操作

1)修改最後一次送出

$ git commit --amend

如果想要撤銷剛才的送出操作,我們可以使用此操作。此指令将使用目前的暫存區快照送出。

如果剛才送出資訊寫錯,而送出完沒有任何改動,直接運作此指令,相當于有機會重新編輯送出說明,但将要送出的檔案快照和之前的一樣。

如果剛才送出時忘了暫存某些修改,可以補上暫存操作,然後再運作 --amend送出:

$ git commit -m "initial commit"

$ git add forgotten_file

$ git commit --amend

2)取消已暫存的檔案

比如有兩個修改過的檔案,我們想分開送出,但不小心使用git add . 全部送出到暫存區域。如何撤銷其中的一個檔案呢?

$ git reset HEAD bench.txt

現在bench.txt回到了已修改未暫存的狀态。

3)取消對檔案的修改

$ git checkout -- bench.txt

可以看到,該檔案已經恢複到修改前的版本。你可能已經意識到了,這條指令有些危險,所有對檔案的修改都沒有了,因為我們剛剛把之前版本的檔案複制過 來重寫了此檔案。是以在用這條指令前,請務必确定真的不再需要保留剛才的修改。

5、遠端倉庫的使用

1)檢視目前的遠端庫

$ git remote

此指令會列出每個遠端庫的簡短名字。在克隆完某個項目後,至少可以看到一個名為 origin 的遠端庫,Git 預設使用這個名字來辨別你所克隆的原始倉庫。

2)添加遠端倉庫

$ git remote add pb git://github.com/paulboone/ticgit.git

現在可以用字串 pb 指代對應的倉庫位址了。比如說,要抓取所有 Paul 有的,但本地倉庫沒有的資訊,可以運作 git fetch pb。

3)從遠端倉庫抓取資料

$ git fetch [remote-name]

【etc.】

4)推送資料到遠端倉庫

$ git push [remote-name] [branch-name]

【etc.】

5)檢視遠端倉庫資訊

$ git remote show [remote-name]

6)遠端倉庫的删除和重命名

重命名:$ git remote rename oldname newname

删除:$ git remote rm [remote-name]

6、打标簽

同大多數 VCS 一樣,Git 也可以對某一時間點上的版本打上标簽。人們在釋出某個軟體版本(比如 v1.0 等等)的時候,經常這麼做。本節我們一起來學習如何列出所有可用的标簽,如何建立标簽,以及各種不同類型标簽之間的差别。

1)列顯已有标簽

$ git tag

2)建立标簽

Git 使用的标簽有兩種類型:輕量級的(lightweight)和含附注的(annotated)。輕量級标簽就像是個不會變化的分支,實際上它就是個指向特 定送出對象的引用。而含附注标簽,實際上是存儲在倉庫中的一個獨立對象,它有自身的校驗和資訊,包含着标簽的名字,電子郵件位址和日期,以及标簽說明,标 簽本身也允許使用 GNU Privacy Guard (GPG) 來簽署或驗證。一般我們都建議使用含附注型的标簽,以便保留相關資訊;當然,如果隻是臨時性加注标簽,或者不需要旁注額外資訊,用輕量級标簽也沒問題。

3)含附注的标簽

建立一個含附注類型的标簽非常簡單,用 -a (譯注:取 annotated 的首字母)指定标簽名字即可:

$ git tag -a v1.4 -m 'my version 1.4'

-m為指定對應的标簽說明。

4)簽署标簽

如果你有自己的私鑰,還可以用 GPG 來簽署标簽,隻需要把之前的 -a 改為 -s (譯注: 取 signed 的首字母)即可:
$ git tag -s v1.5 -m 'my version 1.5'

5)輕量級标簽

輕量級标簽實際上就是一個儲存着對應送出對象的校驗和資訊的檔案。要建立這樣的标簽,一個 -a,-s 或 -m 選項都不用,直接給出标簽名字即可:

$ git tag v1.4-lw

運作 git show 檢視此标簽資訊,就隻有相應的送出對象摘要。

6)驗證标簽

可以使用 git tag -v [tag-name] (譯注:取 verify 的首字母)的方式驗證已經簽署的标簽。此指令會調用 GPG 來驗證簽名,是以你需要有簽署者的公鑰,存放在 keyring 中,才能驗證:

$ git tag -v v1.4.2.1

7)後期加注标簽

你甚至可以在後期對早先的某次送出加注标簽。

我們忘了在送出 “updated rakefile” 後為此項目打上版本号 v1.2,沒關系,現在也能做。隻要在打标簽的時候跟上對應送出對象的校驗和(或前幾位字元)即可:

$ git tag -a v1.2 9fceb03

8)分享标簽

預設情況下,git push 并不會把标簽傳送到遠端伺服器上,隻有通過顯式指令才能分享标簽到遠端倉庫。其指令格式如同推送分支,運作git push origin [tagname] 即可:

$ git push origin v1.5

或者一次性推送本地所有新增标簽:$ git push origin --tags

現在,其他人克隆共享倉庫或拉取資料同步後,也會看到這些标簽。

繼續閱讀