做者:@csswizardrycss
原文:Little Things I Like to Do with Githtml
隨便說點:這篇文章主要從管理者的角度談論了使用 git 的心得,使用大量篇幅介紹
git log
的一些方法和技巧。git一樣地,發現不少人其實並無深刻全面地去了解過 git 的用法,做爲一名開發人員,大多數時候只要會使用
git pull
,git add
,git commit
,git push
彷佛就足夠,還有很大一部分人只使用特定的圖形化工具。但事實上真的是這樣嗎,可能在遇到某個稍微高級一點的問題或者需求就手足無措。對於某個特定個體而言,不少場景咱們未必會遇到,即便碰到也能夠現場尋求搜索工具的幫助,這也是一種學習方式,無心否認這種方式,但最大的問題就是隻見一葉而難以窺見森林。在這裏推薦一個小工具 githug,經過一種比較輕鬆的遊戲的方式來一探全貌。github
在跟個人朋友 Tim 聊天的時候,談到我有多喜歡 Git。做爲常用的一個工具,它強大而優雅。在這裏,介紹一下我我的使用得最多,同時也是最有用的一些小技巧。markdown
不管你認爲在工做中的遊戲化(gamification)和競爭是好是壞,對於這個話題在不一樣的時間多是徹底不一樣的結論。但若是你對團隊成員在項目中的提交數量感興趣,使用 shortlog
就能夠找到答案:工具
$ git shortlog -sn 80 Harry Roberts 34 Samantha Peters 3 Tom Smith
shortlog
能夠視做對 git log
的概要。學習
-s
選項將隱藏提交描述,僅提供提交計數摘要fetch
-n
選項將根據每一個做者的提交數對輸出進行排序,而不是默認的按做者字母順序。日誌
上面顯示的是項目生命週期的全部提交,可是若是想查看在特定時間內的狀況,可使用 --since
和 --until
選項:excel
$ git shortlog -sn --since='10 weeks' --until='2 weeks' 59 Harry Roberts 24 Samantha Peters
我爲此配置了別名 $ git stats
Git 有一個很是有用的 blame
功能,容許咱們查看特定代碼段的負責開發人員:
# See who last changed lines 5 through 10 of the buttons’ CSS: $ git blame -L5,10 _components.buttons.scss
這一條放在這裏講好像有點過頭,像是咱們在找開發人員哪些地方作錯了。但也不徹底是這樣,另外一方面,他們可能已經作了一些咱們想要了解的特別厲害或是印象深入的事情。咱們本來會問,哇!我以前尚未看到這個功能,還想知道是誰作的。
因爲是從 SVN 轉到 Git,我使用 praise
做爲 blame
的別名,這樣兩者均可以使用:
$ git config --global alias.praise blame
即,我也能夠這樣作:
# Find out who implemented Resource Hints and buy them a coffee: $ git praise -L18,23 _includes/head.html
只是一點小變化,但效果不錯。
當使用 diff
或 show
查看具備大量空白變化的版本對比時,會有不少視覺噪音干擾咱們,使得很難看到更重要的變化內容。
幸運的是,去除這種空白提示很是容易,在 git diff
和 git show
使用 -w
選項就能夠輕鬆搞定。好比,以前:
a { color: $color-links; -&:hover { - color: $color-links-hover; -} + &:hover { + color: $color-links-hover; + text-decoration: underline; + } }
使用 -w
以後:
a { color: $color-links; &:hover { color: $color-links-hover; + text-decoration: underline; } }
如今能夠很容易看出,惟一有意義的變化是增長了 text-decoration: underline;
,而其他的 diff
是有點誤導性的。
寫代碼跟寫文章不一樣,查看變化的單詞而不是整行一般會更有用; 這在編輯 markdown 文檔時尤爲有用,就像如今。
幸運的是,咱們只要使用 --word-diff
選項就能顯示單詞的變化:
$ git diff --word-diff
跟不使用 --word-diff
選項的區別仍是很大的:
-My friend Tom recently gave an excellent talk +My good friend Tom gave an excellent talk
若是啓用 --word-diff
,咱們能獲得更便於理解和更有用的概覽:
My {+good+} friend Tom [-recently-] gave an excellent talk
注意只有變化的文本被突出顯示(經過 {+ +}
和 [- -]
)
在任何給定的項目,在許多不一樣的分支之間切換是很常見的,而且跟蹤它們可能至關棘手。咱們可讓 Git 幫助咱們解決這個問題:
$ git for-each-ref --count=10 --sort=-committerdate refs/heads/ --format="%(refname:short)"
經過這個命令能夠知道最近在工做的 10(--count=10)個分支,按照上次工做的時間排序。只顯示本地分支(refs/heads/
),並經過 --format
選項得到更友好的呈現方式。
這是一個有點冗長的命令,因此我爲此配置別名 $ git recent
。
git config --global alias.recent "for-each-ref --count=10 --sort=-committerdate refs/heads/ --format=\"%(refname:short)\""
有時候,特別是對於團隊領導,瞭解團隊成員在全部分支的行爲概覽是頗有用的。再一次地,Git 可讓這一切變得很容易:
$ git log --all --oneline --no-merges
這能夠獲得一份關於全部人的日誌報告簡化版(帶有 --no-merges
選項)
咱們也能夠經過 --since
選項來限制返回的提交數量:
$ git log --all --since='2 weeks' --oneline --no-merges
這樣咱們能夠看到,在過去的兩個星期裏,每一個人都在作什麼。
能夠配置一個別名 $ git overview
git config --global alias.overview "log --all --since='2 weeks' --oneline --no-merges"
當你回到一個比較舊的項目,或是在長時間休息以後回到辦公室,可能不知道你最後在作什麼工做,這種狀況時常發生。咱們能夠經過 Git 輕鬆得到咱們在項目中的工做狀況:
$ git log --all --oneline --no-merges --author=<your email address>
和上一條很相似,只是咱們將日誌限制於咱們本身的提交,也能夠增長 --since
限制。
這也有一個別名 $ git recap
。
git config --global alias.recap "log --all --oneline --no-merges --author=name@mail.com"
一樣地,不在這裏討論如何衡量開發人員的生產力,但我以爲讓客戶知道我在任何一天的工做狀況是頗有用的。不是要你保留完成任務的詳細列表,咱們可使用 Git 獲取全部這些信息:
$ git log --since=00:00:00 --all --no-merges --oneline --author=<your email address>
這將記錄(log
) 你工做的全部(--all
)分支,誰(--author
)從(--since
)午夜開始都作了什麼,(不包括合併提交 --no-merges
),並提供一個簡單的一行 (--oneline
) 概述。
我有這個別名 $ git today
。
git config --global alias.today "log --since=00:00:00 --all --no-merges --oneline --author=name@mail.com"
維護一份 CHANGELOG 可能有點乏味,咱們必須查看自上次發佈以來所作的全部工做,而後提取其中有用的部分。幸運的是,咱們可使用 Git 來給咱們一個好的開頭:
$ git log --oneline --no-merges <last tag>..HEAD
注意:HEAD
是可選的,若是你省略(即... --no-merges <last tag>..),HEAD
會是隱含的,固然這樣能夠節省幾回敲擊鍵盤的時間。
這將建立一個簡化的日誌,顯示最後一個發佈版本和 HEAD
之間的全部提交(不包括合併提交)。
例如:
$ git log --oneline --no-merges 1.0.0.. 1257b95 [refs #00019] Bump version 2b9b28e [refs #00019] Add auto width class 17b8eb1 [refs #00015] Tidy up README.md bbe7d05 [refs #00012] Rename Supercell main mixin
這告訴我,自從上次發佈(1.0.0)到當前項目狀態(HEAD
),已經完成哪些工做。這對於 CHANGELOG 來講是一個很好的參考。
注意:不只僅適用於 tag,還可使用提交哈希。
若是你在一段時間內不在項目,可能須要先檢查上游的變動,而後再將這些更新下載到本地分支。
$ git log --oneline --no-merges HEAD..<remote>/<branch>
注意:一樣地,HEAD
在這裏是可選的,省略將使其隱含。
例如,讓咱們來看看你在度假時在特性分支作了什麼:
$ git checkout feature/fonts $ git fetch $ git log --oneline --no-merges ..origin/feature/fonts
我使用這個別名 $ git upstream
。
最好的狀況是能夠常常提交和上傳,但若是某種緣由致使有大量的本地提交還沒有上傳,能夠快速回顧一下都是什麼。
爲了作到這一點,咱們反轉以前的命令就能輕鬆實現:
$ git log --oneline --no-merges <remote>/<branch>..HEAD
例如:
$ git fetch $ git log --oneline --no-merges origin/feature/fonts..HEAD
注意:一樣地,HEAD
在這裏是可選的,省略將使其隱含。
這將記錄 HEAD
須要上傳到 <remote>/<branch>
的提交。
我使用這個別名 $ git local
。
上面的每個例子都使用簡化的日誌,由於只想快速瞭解發生了什麼。對於更多細節,我使用帶有 --graph
選項的日誌和一些額外的選項:
$ git log --graph --all --decorate --stat --date=iso
這將給出全部(--all
)分支基於 --graph
的提交記錄 --stat
(添加,刪除)日誌。--decorate
選項會告訴咱們提交信息適用於那些分支,還包含一個更加嚴格的日期格式。
我使用這個別名 $ git graph
。
git config --global alias.graph "log --graph --all --decorate --stat --date=iso"