1. 程式人生 > >2.3 Git 基礎

2.3 Git 基礎

檢視提交歷史

在提交了若干更新,又或者克隆了某個專案之後,你也許想回顧下提交歷史. 完成這個任務最簡單而又有效的工具是 git log 命令。

接下來的例子會用我專門用於演示的 simplegit 專案, 執行下面的命令獲取該專案原始碼:

git clone https://github.com/schacon/simplegit-progit

然後在此專案中執行 git log,應該會看到下面的輸出:

$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <[email protected]
>
Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Author: Scott Chacon <[email protected]> Date: Sat Mar 15 16:40:33 2008 -0700 removed unnecessary test commit a11bef06a3f659402fe7563abf99ad00de2209e6 Author: Scott Chacon <
[email protected]
>
Date: Sat Mar 15 10:31:28 2008 -0700 first commit

預設不用任何引數的話,git log 會按提交時間列出所有的更新,最近的更新排在最上面。 正如你所看到的,這個命令會列出每個提交的 SHA-1 校驗和、作者的名字和電子郵件地址、提交時間以及提交說明。

git log 有許多選項可以幫助你搜尋你所要找的提交, 接下來我們介紹些最常用的。

一個常用的選項是 -p,用來顯示每次提交的內容差異。 你也可以加上 -2 來僅顯示最近兩次提交:

$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <[email protected]> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number diff --git a/Rakefile b/Rakefile index a874b73..8f94139 100644 --- a/Rakefile +++ b/Rakefile @@ -5,7 +5,7 @@ require 'rake/gempackagetask' spec = Gem::Specification.new do |s| s.platform = Gem::Platform::RUBY s.name = "simplegit" - s.version = "0.1.0" + s.version = "0.1.1" s.author = "Scott Chacon" s.email = "[email protected]" s.summary = "A simple gem for using Git in Ruby code." commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Author: Scott Chacon <[email protected]> Date: Sat Mar 15 16:40:33 2008 -0700 removed unnecessary test diff --git a/lib/simplegit.rb b/lib/simplegit.rb index a0a60ae..47c6340 100644 --- a/lib/simplegit.rb +++ b/lib/simplegit.rb @@ -18,8 +18,3 @@ class SimpleGit end end - -if $0 == __FILE__ - git = SimpleGit.new - puts git.show -end \ No newline at end of file

該選項除了顯示基本資訊之外,還在附帶了每次 commit 的變化。 當進行程式碼審查,或者快速瀏覽某個搭檔提交的 commit 所帶來的變化的時候,這個引數就非常有用了。 你也可以為 git log 附帶一系列的總結性選項。 比如說,如果你想看到每次提交的簡略的統計資訊,你可以使用 --stat 選項:

$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <[email protected]>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

 Rakefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <[email protected]>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test

 lib/simplegit.rb | 5 -----
 1 file changed, 5 deletions(-)

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <[email protected]>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit

 README           |  6 ++++++
 Rakefile         | 23 +++++++++++++++++++++++
 lib/simplegit.rb | 25 +++++++++++++++++++++++++
 3 files changed, 54 insertions(+)

正如你所看到的,--stat 選項在每次提交的下面列出額所有被修改過的檔案、有多少檔案被修改了以及被修改過的檔案的哪些行被移除或是添加了。 在每次提交的最後還有一個總結。

另外一個常用的選項是 --pretty。 這個選項可以指定使用不同於預設格式的方式展示提交歷史。 這個選項有一些內建的子選項供你使用。 比如用 oneline 將每個提交放在一行顯示,檢視的提交數很大時非常有用。 另外還有 shortfull 和 fuller 可以用,展示的資訊或多或少有些不同,請自己動手實踐一下看看效果如何。

$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit

但最有意思的是 format,可以定製要顯示的記錄格式。 這樣的輸出對後期提取分析格外有用 — 因為你知道輸出的格式不會隨著Git的更新而發生改變:

$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : changed the version number
085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
a11bef0 - Scott Chacon, 6 years ago : first commit

Table 2-1 列出了常用的格式佔位符寫法及其代表的意義。

Table 2-1. git log --pretty=format 常用的選項
選項 說明

%H

提交物件(commit)的完整雜湊字串

%h

提交物件的簡短雜湊字串

%T

樹物件(tree)的完整雜湊字串

%t

樹物件的簡短雜湊字串

%P

父物件(parent)的完整雜湊字串

%p

父物件的簡短雜湊字串

%an

作者(author)的名字

%ae

作者的電子郵件地址

%ad

作者修訂日期(可以用 --date= 選項定製格式)

%ar

作者修訂日期,按多久以前的方式顯示

%cn

提交者(committer)的名字

%ce

提交者的電子郵件地址

%cd

提交日期

%cr

提交日期,按多久以前的方式顯示

%s

提交說明

你一定奇怪 作者 和 提交者 之間究竟有何差別, 其實作者指的是實際作出修改的人,提交者指的是最後將此工作成果提交到倉庫的人。 所以,當你為某個專案釋出補丁,然後某個核心成員將你的補丁併入專案時,你就是作者,而那個核心成員就是提交者。 我們會在 分散式 Git 再詳細介紹兩者之間的細微差別。

當 oneline 或 format 與另一個 log 選項 --graph 結合使用時尤其有用。 這個選項添加了一些ASCII字串來形象地展示你的分支、合併歷史:

$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
*  5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
*  11d191e Merge branch 'defunkt' into local

這種輸出型別會在我們下一張學完分支與合併以後變得更加有趣。

以上只是簡單介紹了一些 git log 命令支援的選項。 Table 2-2 列出了我們目前涉及到的和沒涉及到的選項,已經它們是如何影響 log 命令的輸出的:

Table 2-2. git log 的常用選項
選項 說明

-p

按補丁格式顯示每個更新之間的差異。

--stat

顯示每次更新的檔案修改統計資訊。

--shortstat

只顯示 --stat 中最後的行數修改新增移除統計。

--name-only

僅在提交資訊後顯示已修改的檔案清單。

--name-status

顯示新增、修改、刪除的檔案清單。

--abbrev-commit

僅顯示 SHA-1 的前幾個字元,而非所有的 40 個字元。

--relative-date

使用較短的相對時間顯示(比如,“2 weeks ago”)。

--graph

顯示 ASCII 圖形表示的分支合併歷史。

--pretty

使用其他格式顯示歷史提交資訊。可用的選項包括 oneline,short,full,fuller 和 format(後跟指定格式)。

除了定製輸出格式的選項之外,git log 還有許多非常實用的限制輸出長度的選項,也就是隻輸出部分提交資訊。 之前你已經看到過 -2 了,它只顯示最近的兩條提交, 實際上,這是 -<n> 選項的寫法,其中的 n 可以是任何整數,表示僅顯示最近的若干條提交。 不過實踐中我們是不太用這個選項的,Git 在輸出所有提交時會自動呼叫分頁程式,所以你一次只會看到一頁的內容。

另外還有按照時間作限制的選項,比如 --since 和 --until 也很有用。 例如,下面的命令列出所有最近兩週內的提交:

$ git log --since=2.weeks

這個命令可以在多種格式下工作,比如說具體的某一天 "2008-01-15",或者是相對地多久以前 "2 years 1 day 3 minutes ago"

還可以給出若干搜尋條件,列出符合的提交。 用 --author 選項顯示指定作者的提交,用 --grep 選項搜尋提交說明中的關鍵字。 (請注意,如果要得到同時滿足這兩個選項搜尋條件的提交,就必須用 --all-match 選項。否則,滿足任意一個條件的提交都會被匹配出來)

另一個非常有用的篩選選項是 -S,可以列出那些新增或移除了某些字串的提交。 比如說,你想找出新增或移除了某一個特定函式的引用的提交,你可以這樣使用:

$ git log -Sfunction_name

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

Table 2-3. 限制 git log 輸出的選項
選項 說明

-(n)

僅顯示最近的 n 條提交

--since--after

僅顯示指定時間之後的提交。

--until--before

僅顯示指定時間之前的提交。

--author

僅顯示指定作者相關的提交。

--committer

僅顯示指定提交者相關的提交。

--grep

僅顯示含指定關鍵字的提交

-S

僅顯示新增或移除了某個關鍵字的提交

來看一個實際的例子,如果要檢視 Git 倉庫中,2008 年 10 月期間,Junio Hamano 提交的但未合併的測試檔案,可以用下面的查詢命令:

$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
   --before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attributes are in use
acd3b9e - Enhance hold_lock_file_for_{update,append}() API
f563754 - demonstrate breakage of detached checkout with symbolic link HEAD
d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths
51a94af - Fix "checkout --track -b newbranch" on detached HEAD
b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch

在近40000條提交中,上面的輸出僅列出了符合條件的6條記錄。

相關推薦

2.3 Git 基礎

檢視提交歷史 在提交了若干更新,又或者克隆了某個專案之後,你也許想回顧下提交歷史. 完成這個任務最簡單而又有效的工具是 git log 命令。 接下來的例子會用我專門用於演示的 simplegit 專案, 執行下面的命令獲取該專案原始碼: git clone http

2.4 Git 基礎

撤消操作 任何時候,你都有可能需要撤消剛才所做的某些操作。接下來,我們會介紹一些基本的撤消操作相關的命令。請注意,有些撤銷操作是不可逆的,所以請務必謹慎小心,一旦失誤,就有可能丟失部分工作成果。 有時候我們提交完了才發現漏掉了幾個檔案沒有加,或者提交資訊寫錯了。想要撤消剛才的提交操作,可以使用 --ame

JavaScript基礎 substr(2, 3) 2是起始的index的值 3是提出來3個字符

subst bstr 博文 htm bst firefox 傳智播客 src 部分 鎮場詩:    清心感悟智慧語,不著世間名與利。學水處下納百川,舍盡貢高我慢意。    學有小成返哺根,願鑄一良心博客。誠心於此寫經驗,願見文者得啟發。——————————————————

編程算法基礎-2.3進制轉換

split -c val character -s 割點 12px 轉換 isdigit 2.3進制轉換 使用int存一個整數時。內存中是用二進制存儲的,當要顯示的時候。用十進制顯示。 隨意進制間的轉換 n進制轉m進制 String s = “2001201102” 3

Android基礎新手教程——4.2.3 Service精通

類繼承 存儲 構造 string 分隔 span 並不是 mib first Android基礎新手教程——4.2.3 Service精通

Git基礎入門(四)Git基本操作2

git 操作 基礎忽略文件: 在實際開發過程中總有些文件無需納入Git的管理,比如日誌文件、臨時文件等 在這種情況下,我們可以在工作目錄中創建一個名為.gitignore的文件,列出要忽略的文件名或者表達式 例:cat .gitignore *.[oa]

MATLAB入門學習-#3-矩陣基礎#2特殊矩陣的建立和程式示例

MATLAB入門學習-#3-矩陣基礎#2特殊矩陣的建立和程式示例 1.零矩陣zeros 2.么矩陣ones 3.單位矩陣eye 4.隨機矩陣rand&randn 5.魔方矩陣magic 6.Hilbert矩陣 7.Toepli

第二節課,安裝紅帽7,基礎命令至2.3小節的筆記

筆記 實驗環境:   1、安裝注意事項:使用VM12版本             安裝需要稍後安裝系統。             自定義硬體DVD選擇映象位置。             自定義網絡卡僅主機。             自定義記憶體:大於等於4G

2-3 R語言基礎 矩陣和數組

not 方法 ttr error bind names cbi 向量 bin #矩陣Matrix 三個參數:內容(可省),行數,列數 > x <- matrix(1:6,nrow = 3,ncol = 2) #第一個是內容,第二個,第三個是行列> x[1

2.3 Python語言基礎

opera 實現 -o recent ast 如果 traceback 功能 tin 2.3 Python語言基礎 1 語言語義(Language Semantics) 縮進,而不是括號 Python使用空格(tabs or spaces)來組織代碼結構,而不是像R,C++

Python基礎筆記(2.3-2.5)

2.3 流程控制--for字典dic={'a':1,'b':2}for k in dic: 遍歷字典print k 格式化輸出 iteritems() 方法 用法和items()方法一樣 它返回的也是一個物件 和xrange()異曲同工 小例子:通過python寫乘法口訣#!/usr/bin/pytho

微信小程式開發入門——請使用2.2.3或以上的基礎庫以使用雲能力

今天下載微信小程式開發工具安裝使用,選擇“建立雲開發快速啟動模板”後,出現了這樣的提示----“請使用2.2.3或以上的基礎庫以使用雲能力”。   查看了官方文件後,解決方案如下: 1、點選選擇“詳情”   2、除錯基礎庫選擇2.2.3或

[Spark基礎]--Spark-2.3.2釋出說明

2018-09-24 Apache spark又釋出新版本了,看看發行說明: sub-task [ SPARK-24976 ] - 允許十進位制型別轉換null(特定於PyArrow 0.9.0)

scala-Unit-3-Scala基礎語法2

一、定義方法、函式、及方法轉換為函式   1.方法的定義:     def  方法名(引數1:資料型別,引數2:資料型別...):返回值型別 ={       }   2.定義函式:     val h1 = (a:Int,b:Int) => {a * b}   3.方

爬蟲3 requests基礎2 代理 證書 重定向 響應時間

9.1 取消 時間 span timeout rec https style res import requests # 代理 # proxy = { # ‘http‘:‘http://182.61.29.114.6868‘ # } # res = request

程式設計師必會技能系列(2git中merge和rebase比較-3

git中有兩個合併分支的方法,一個是git merge,另一個是git rebase。 一、git merge 講解 1、畫圖講解git merge 用merge合併分支時不會改變歷史(通俗的說就是commit號不會變)。在git中merge會創造一個

Electron 基礎教程-2.3 主程序(Main Process)

主程序(Main Process) 正如之前所提,Electron有兩大程序:主程序(Main Process)和渲染程序(Renderer Process)。在這個示例程式中,主程序程式碼就在main.js檔案中。 Note 通常將主程序檔案命

基礎教程!一文教你使用Rancher 2.3和Terraform執行Windows容器

本文來自Rancher Labs 介 紹 在Kubernetes 1.14版本中已經GA了對Windows的支援。這一結果凝結了一群優秀的工程師的努力,他們來自微軟、Pivotal、VMware、紅帽以及現在已經關閉的Apprenda等幾家公司。我在Apprenda工作時,不定時會為sig-windows社群

掌握SpringBoot-2.3的容器探針:基礎

### 歡迎訪問我的GitHub - 地址:[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) - 內容:原創文章分類彙總,及配套原始碼,涉及Java、Docker、K8S、DevOPS等 ### 關於《S

在Sql中將 varchar 值 '1,2,3,4,5,6' 轉換成數據類型 int

給定 序列 顯示 結果 空格 sel -方法 一個表 affect --問題:將aa轉換為Int類型失敗 string aa="3,5,11,56,88,45,23"; select * from ERPBuMen where ID in(aa) ; --方法sel