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 就相當於運行了下面三條命令:$mvREADME.txt README  $ git rmREADME.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

現在,其他人克隆共享倉庫或拉取數據同步後,也會看到這些標籤。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章