標籤:

喜歡用 Git 做的一些小事

作者:@csswizardry

原文:Little Things I Like to Do with Git

隨便說點:這篇文章主要從管理者的角度談論了使用 git 的心得,使用大量篇幅介紹 git log 的一些方法和技巧。

同樣地,發現很多人其實並沒有深入全面地去了解過 git 的用法,作為一名開發人員,大多數時候只要會使用 git pull,git add,git commit,git push 似乎就足夠,還有很大一部分人只使用特定的圖形化工具。但事實上真的是這樣嗎,可能在遇到某個稍微高級一點的問題或者需求就手足無措。對於某個特定個體而言,很多場景我們未必會遇到,即使碰到也可以現場尋求搜索工具的幫助,這也是一種學習方式,無意否定這種方式,但最大的問題就是只見一葉而難以窺見森林。在這裡推薦一個小工具 githug,通過一種比較輕鬆的遊戲的方式來一探全貌。

在跟我的朋友 Tim 聊天的時候,談到我有多喜歡 Git。作為經常使用的一個工具,它強大而優雅。在這裡,介紹一下我個人使用得最多,同時也是最有用的一些小技巧。

管理者面板

無論你認為在工作中的遊戲化(gamification)和競爭是好是壞,對於這個話題在不同的時間可能是完全不同的結論。但如果你對團隊成員在項目中的提交數量感興趣,使用 shortlog 就可以找到答案:

$ git shortlog -snn 80 Harry Robertsn 34 Samantha Petersn 3 Tom Smithn

shortlog 可以視作對 git log 的概要。

  • -s選項將隱藏提交描述,僅提供提交計數摘要

  • -n 選項將根據每個作者的提交數對輸出進行排序,而不是默認的按作者字母順序。

上面顯示的是項目生命周期的所有提交,但是如果想查看在特定時間內的情況,可以使用 --since 和 --until 選項:

$ git shortlog -sn --since=10 weeks --until=2 weeksn 59 Harry Robertsn 24 Samantha Petersn

我為此配置了別名 $ git stats

責任人

Git 有一個非常有用的 blame 功能,允許我們查看特定代碼段的負責開發人員:

# See who last changed lines 5 through 10 of the buttons』 CSS:n$ git blame -L5,10 _components.buttons.scssn

這一條放在這裡講好像有點過頭,像是我們在找開發人員哪些地方做錯了。但也不完全是這樣,另一方面,他們可能已經做了一些我們想要了解的特別厲害或是印象深刻的事情。我們原本會問,哇!我之前還沒有看到這個功能,還想知道是誰做的。

由於是從 SVN 轉到 Git,我使用 praise 作為 blame 的別名,這樣二者都可以使用:

$ git config --global alias.praise blamen

即,我也可以這樣做:

# Find out who implemented Resource Hints and buy them a coffee:n$ git praise -L18,23 _includes/head.htmln

只是一點小變化,但效果不錯。

隱藏空白提示

當使用 diff 或 show 查看具有大量空白變化的版本對比時,會有很多視覺噪音干擾我們,使得很難看到更重要的變化內容。

幸運的是,去除這種空白提示非常容易,在 git diff 和 git show 使用 -w 選項就可以輕鬆搞定。比如,之前:

a {n color: $color-links;nn-&:hover {n- color: $color-links-hover;n-}n+ &:hover {n+ color: $color-links-hover;n+ text-decoration: underline;n+ }nn}n

使用 -w 之後:

a {n color: $color-links;nn &:hover {n color: $color-links-hover;n+ text-decoration: underline;n }nn}n

現在可以很容易看出,唯一有意義的變化是增加了 text-decoration: underline;,而其餘的 diff 是有點誤導性的。

僅顯示單詞的變化而不是整行

寫代碼跟寫文章不同,查看變化的單詞而不是整行通常會更有用; 這在編輯 markdown 文檔時尤其有用,就像現在。

幸運的是,我們只要使用 --word-diff 選項就能顯示單詞的變化:

$ git diff --word-diffn

跟不使用 --word-diff 選項的區別還是很大的:

-My friend Tom recently gave an excellent talkn+My good friend Tom gave an excellent talkn

如果啟用 --word-diff,我們能得到更便於理解和更有用的概覽:

My {+good+} friend Tom [-recently-] gave an excellent talkn

注意只有變化的文本被突出顯示(通過 {+ +} 和 [- -])

查看最近工作的分支

在任何給定的項目,在許多不同的分支之間切換是很常見的,並且跟蹤它們可能相當棘手。我們可以讓 Git 幫助我們解決這個問題:

$ git for-each-ref --count=10 --sort=-committerdate refs/heads/ --format="%(refname:short)"n

通過這個命令可以知道最近在工作的 10(--count=10)個分支,按照上次工作的時間排序。只顯示本地分支(refs/heads/),並通過 --format 選項獲得更友好的呈現方式。

這是一個有點冗長的命令,所以我為此配置別名 $ git recent。

看到每個人都在做什麼

有時候,特別是對於團隊領導,了解團隊成員在所有分支的行為概覽是很有用的。再一次地,Git 可以讓這一切變得很容易:

$ git log --all --oneline --no-mergesn

這可以得到一份關於所有人的日誌報告簡化版(帶有 --no-merges 選項)

我們也可以通過 --since 選項來限制返回的提交數量:

$ git log --all --since=2 weeks --oneline --no-mergesn

這樣我們可以看到,在過去的兩個星期里,每個人都在做什麼。

可以配置一個別名 $ git overview

提醒你自己已經做了什麼

當你回到一個比較舊的項目,或是在長時間休息之後回到辦公室,可能不知道你最後在做什麼工作,這種情況時常發生。我們可以通過 Git 輕鬆獲得我們在項目中的工作情況:

$ git log --all --oneline --no-merges --author=<your email address>n

和上一條很類似,只是我們將日誌限制於我們自己的提交,也可以增加 --since 限制。

這也有一個別名 $ git recap。

今天的工作

同樣地,不在這裡討論如何衡量開發人員的生產力,但我覺得讓客戶知道我在任何一天的工作情況是很有用的。不是要你保留完成任務的詳細列表,我們可以使用 Git 獲取所有這些信息:

$ git log --since=00:00:00 --all --no-merges --oneline --author=<your email address>n

這將記錄(log)你工作的所有(--all)分支,誰(--author)從(--since)午夜開始都做了什麼,(不包括合併提交 --no-merges),並提供一個簡單的一行 (--oneline) 概述。

我有這個別名 $ git today。

生成更改日誌

維護一份 CHANGELOG 可能有點乏味,我們必須查看自上次發布以來所做的所有工作,然後提取其中有用的部分。幸運的是,我們可以使用 Git 來給我們一個好的開頭:

$ git log --oneline --no-merges <last tag>..HEADn

注意:HEAD 是可選的,如果你省略(即... --no-merges <last tag>..),HEAD 會是隱含的,當然這樣可以節省幾次敲擊鍵盤的時間。

這將創建一個簡化的日誌,顯示最後一個發布版本和 HEAD 之間的所有提交(不包括合併提交)。

例如:

$ git log --oneline --no-merges 1.0.0..n1257b95 [refs #00019] Bump versionn2b9b28e [refs #00019] Add auto width classn17b8eb1 [refs #00015] Tidy up README.mdnbbe7d05 [refs #00012] Rename Supercell main mixinn

這告訴我,自從上次發布(1.0.0)到當前項目狀態(HEAD),已經完成哪些工作。這對於 CHANGELOG 來說是一個很好的參考。

注意:不僅僅適用於 tag,還可以使用提交哈希。

檢查需要拉取哪些變化

如果你在一段時間內不在項目,可能需要先檢查上游的變更,然後再將這些更新下載到本地分支。

$ git log --oneline --no-merges HEAD..<remote>/<branch>n

注意:同樣地,HEAD 在這裡是可選的,省略將使其隱含。

例如,讓我們來看看你在度假時在特性分支做了什麼:

$ git checkout feature/fontsn$ git fetchn$ git log --oneline --no-merges ..origin/feature/fontsn

我使用這個別名 $ git upstream。

檢查即將上傳的內容

最好的情況是可以經常提交和上傳,但如果某種原因導致有大量的本地提交尚未上傳,可以快速回顧一下都是什麼。

為了做到這一點,我們反轉之前的命令就能輕鬆實現:

$ git log --oneline --no-merges <remote>/<branch>..HEADn

例如:

$ git fetchn$ git log --oneline --no-merges origin/feature/fonts..HEADn

注意:同樣地,HEAD 在這裡是可選的,省略將使其隱含。

這將記錄 HEAD 需要上傳到 <remote>/<branch> 的提交。

我使用這個別名 $ git local。

查看複雜日誌

上面的每一個例子都使用簡化的日誌,因為只想快速了解發生了什麼。對於更多細節,我使用帶有 --graph 選項的日誌和一些額外的選項:

$ git log --graph --all --decorate --stat --date=ison

這將給出所有(--all)分支基於 --graph 的提交記錄 --stat(添加,刪除)日誌。--decorate 選項會告訴我們提交信息適用於那些分支,還包含一個更加嚴格的日期格式。

我使用這個別名 $ git graph。


推薦閱讀:

git如何push時不輸入密碼?
git clone一個github上的倉庫,太慢,經常連接失敗,但是github官網流暢訪問,為什麼?
Git 初學者攻略
Git由淺入深之存儲原理

TAG:Git |