做者:@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"