1. 程式人生 > >(譯) 你不知道的 git log

(譯) 你不知道的 git log

原文連結

假設您正在與多個開發者共同維護管理複雜的 git 程式碼庫,那您可能會使用GitHubBitBucket 等工具有深入研究提交歷史,並且希望從中找出分支以及合併 issue 的相關問題。

圖形化介面為使用者提供了非常友好的介面來管理 PR 以及檢視一些簡單的歷史記錄,但是當工作流程 SHTF (譯者注: 這裡我理解為是混亂、糟糕的意思) 已經不能用 git log 來替代或者一些相關的標記來挖掘出實際的情況時,你應該和我一起來通過命令列去學習還有掌握它(git log) 。

一個關於Git Repository 的例子

為了配合這個例子,我特地準備了一個 git 倉庫,可以克隆下來並且執行它:

$ git clone https://github.com/ianmiell/cookbook-openshift3-frozen
$ cd cookbook-openshift3-frozen

git log

git log 是應該是你最熟悉的 vanlilla log 命令:

$ git log

commit f40f8813d7fb1ab9f47aa19a27099c9e1836ed4f 
Author: Ian Miell <ian.miell@gmail.com>
Date: Sat Mar 24 12:00:23 2018 +0000

pip

commit 14df2f39d40c43f9b9915226bc8455c8b27e841b
Author:
Ian Miell <ian.miell@gmail.com> Date: Sat Mar 24 11:55:18 2018 +0000 ignore commit 5d42c78c30e9caff953b42362de29748c1a2a350 Author: Ian Miell <ian.miell@gmail.com> Date: Sat Mar 24 09:43:45 2018 +0000 latest

輸出顯示每一個提交的佔用5+行, 包含了日期、作者的提交資訊以及id。提交資訊按照時間進行倒序排列,因為我們通常只對最近的幾次提交感興趣啊。

NOTE: 值得一提的是,我們可以控制輸出到控制檯的資訊是否包含版本、別名等等

–oneline

其實在大部分時間我都不會關心作者或者提交日期, 因此如果想要在一塊螢幕裡看見更多的資訊,我們可以使用 --oneline 命令來僅顯示提交的 id 資訊以及每一個提交的評論資訊

$ git log --oneline
ecab26a JENKINSFILE: Upgrade from 1.3 only
886111a JENKINSFILE: default is master if not a multi-branch Jenkins build
9816651 Merge branch 'master' of github.com:IshentRas/cookbook-openshift3
bf36cf5 Merge branch 'master' of github.com:IshentRas/cookbook-openshift3

–decorate

檢視 git log 資訊,有時候我們會想知道每一個提交更多的資訊,比如這次提交是來自哪一個分支呢?標籤有嗎,如果有是多少?

此時 --decorate 命令就為我們提供了以上資訊:

$ git log --oneline --decorate
ecab26a (HEAD -> master, origin/master, origin/HEAD) JENKINSFILE: Upgrade from 1.3 only
886111a JENKINSFILE: default is master if not a multi-branch Jenkins build
9816651 Merge branch 'master' of github.com:IshentRas/cookbook-openshift3

其實版本的更新記錄 git 已經設為了預設功能,所以我們不需要敲打額外的命令來獲取相關資訊,這很棒。

–all

$ git log --oneline --decorate --all
ecab26a (HEAD -> master, origin/master, origin/HEAD) JENKINSFILE: Upgrade from 1.3 only
886111a JENKINSFILE: default is master if not a multi-branch Jenkins build
9816651 Merge branch 'master' of github.com:IshentRas/cookbook-openshift3
[...]
a1eceaf DOCS: Known issue added to upgrade docs
774a816 (origin/first_etcd, first_etcd) first_etcd
7bbe328 first_etcd check
654f8e1 (origin/iptables_fix, iptables_fix) retry added to iptables to prevent race conditions with iptables updates
e1ee997 Merge branch 'development'

你能看清楚上面的資訊多了什麼嗎?咱們可以對比一下之前的 --oneline 命令來理解,是的,所有的分支都被展示出來了…

–graph

--graph 命令除了能夠提供以上資訊之外,還能讓我們能夠在命令列中看見類似 git GUI 的輸出,讓我們隨時隨地能夠更輕鬆的理解和掌握我們所需的資訊。

$ git log --oneline --decorate --all --graph
* ecab26a (HEAD -> master, origin/master, origin/HEAD) JENKINSFILE: Upgrade from 1.3 only
* 886111a JENKINSFILE: default is master if not a multi-branch Jenkins build
* 9816651 Merge branch 'master' of github.com:IshentRas/cookbook-openshift3
|\ 
| * bf36cf5 Merge branch 'master' of github.com:IshentRas/cookbook-openshift3
| |\ 
| | * 313c03a JENKINSFILE: quick mode is INFO level only
| | * 340a8f2 JENKINSFILES: divided up into separate jobs
| | * 79e82bc JENKINSFILE: upgrades-specific Jenkinsfile added
| * | dce4c71 Add logic for additional FW for master (When not a node)
* | | d21351c Update utils/atomic
|/ / 
* | 3bd51ba Fix issue with ETCD
* | b87091a Add missing FW for HTTPD
|/ 
* a29df49 Missing (s)
* 51dff3a Fix rubocop

不要驚慌!

以上介紹的問題可能對新手來說比較難以理解和接受,也沒有什麼好的教程能夠指引。但是我會提供一些小技巧來幫助新手更容易的閱讀和理解 git log

* 符號表示對應的某次提交,並且記錄了提交的詳細資訊(這裡只列出了提交id以及第一行評論資訊)

我們可以通過下面這個例子幫助我們看清楚每條分支內容上的改動在分支線上的呈現效果:

| * bf36cf5 Merge branch 'master' of github.com:IshentRas/cookbook-openshift3
| |\ 
| | * 313c03a JENKINSFILE: quick mode is INFO level only

左邊的一條線我們可以看做是穩定的分支,右邊兩條線表示對應的改動,以及彼此之間提交的改動(9816651 and d21351c)。

藍線會將您帶到bf36cf5合併的一個父代(藍色父代的提交標識是什麼?),粉紅色程式碼則轉到另一個父代提交(313c03a)。

左起第二條線會顯示 bf36cf5的一次合併, 第三條則顯示了另一個合併提交313c03a

花點時間弄清楚這些基本資訊是值得的,它將幫助我們更容易的理解後面的相關內容**

–simplify-by-decoration

如果你正在尋找專案的整個歷史並且只想知道關鍵的變化資訊,這個命令可能對你有很大的幫助,如果要結合 --decorate 命令使用的話,需要跟隨在這個命令之後。

它將移除掉提交裡所有我們沒有標記的資訊,當然,最新的一次提交是永遠存在的:

$ git log --oneline --decorate --all --graph --simplify-by-decoration
* ecab26a (HEAD -> master, origin/master, origin/HEAD) JENKINSFILE: Upgrade from 1.3 only
| * 774a816 (origin/first_etcd) first_etcd
|/ 
| * 654f8e1 (origin/iptables_fix) retry added to iptables to prevent race conditions with iptables updates
|/ 
* 652b1ff (origin/new-logic-upgrade) Fix issue iwith kitchen and remove sensitive output
* ed226f7 First commit

檔案資訊

使用 --oneline 命令展示出來的資訊是有點稀少的,所以通常 --stat 能夠提供給你更多關於每次變動的資訊。

數字表示更改的行數,用一個 + 符號表示插入,然後 - 符號表示刪除。這裡是沒有更改概念的,假如一行只有一個單次被修改了,也是新增的意思。

$ git log --oneline --decorate --all --graph --stat
* ecab26a (HEAD -> master, origin/master, origin/HEAD) JENKINSFILE: Upgrade from 1.3 only
| Jenkinsfile.upgrades | 2 +-
| 1 file changed, 1 insertion(+), 1 deletion(-)
* 886111a JENKINSFILE: default is master if not a multi-branch Jenkins build
| Jenkinsfile.full | 2 +-
| Jenkinsfile.upgrades | 2 +-
| 2 files changed, 2 insertions(+), 2 deletions(-)

如果你發現 --stat 很難記住,你可以選擇 --name-only, 但是這會丟失行數變動的相關資訊。

正則在提交中的運用

這個命令使用起來也是很方便的。-G 命令能夠允許您搜尋所有提交,並且通過正則表示式只返回提交和它們的檔案。

下面這個例子j就展示了通過正則表示式搜尋文字為 chef-client 的相關變動:

$ git log -G 'chef-client' --graph --oneline --stat
...
* 22c2b1b Fix script for deploying origin
| scripts/origin_deploy.sh | 65 ++++++++++++-----------------------------------------------------
| 1 file changed, 12 insertions(+), 53 deletions(-)
... 
| * | 1a112bf - Move origin_deploy.sh in scripts folder - Enable HTTPD at startup
| | | origin_deploy.sh | 148 ----------------------------------------------------------------------------------------------------------------------------------------------------
| | | scripts/origin_deploy.sh | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
| | | 2 files changed, 148 insertions(+), 148 deletions(-)
... 
| * | 9bb795d - Add MIT LICENCE model - Add script to auto deploy origin instance
|/ / 
| | origin_deploy.sh | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
| | 1 file changed, 93 insertions(+)

如果你過去花了很多時間使用 git log --patch 來搜尋相關改動的輸出,結合這個命令,就更加完美啦。

有一個奇怪的命令叫做 --pickaxe-all,能夠告訴你每次提交裡所有檔案的變動,不僅僅是通過正則表示式所匹配出來的內容: $ git log -G 'chef-client' --graph --oneline --stat --pickaxe-all

說了這麼多,趕緊去嘗試一下吧~