设为首页 收藏本站
查看: 991|回复: 0

[经验分享] [译]git log进阶

[复制链接]

尚未签到

发表于 2018-1-15 09:41:37 | 显示全部楼层 |阅读模式
格式化log输出

oneline

  --oneline标记将每个commit压缩成一行. 默认情况下显示一个commit>  

0e25143 Merge branch 'feature'  
ad8621a Fix a bug in the feature
  
16b36c6 Add a new feature
  
23ad9ad Add the initial code base
  

  


decorate
  许多时候知道commit是和哪一个分支或tag关联的是非常有用的. --decorate标记会让git log显示每个commit的引用(如:分支、tag等).
  可以和其它的config选项结合使用. 例如, git log --oneline --decorate输出如下:
  

0e25143 (HEAD, master) Merge branch 'feature'  
ad8621a (feature) Fix a bug in the feature
  
16b36c6 Add a new feature
  
23ad9ad (tag: v0.9) Add the initial code base
  

  

  从中可以看出第一个commit在master分支. 第二个commit在一个feature分支, 第四个commit被tag为v0.9.

diffs
  git log有许多选项是为了展示每个commit的不同之处的. 最常用的两个是--stat和-p.
  --stat显示每个commit中每个文件的添加的行数和删除的行数.这对我们了解一个commit大致有些什么修改非常有用. 下面的commit hello.py新增了67行, 删除了38行:
  

commit f2a238924e89ca1d4947662928218a06d39068c3  
Author: John <john@example.com>
  
Date:   Fri Jun 25 17:30:28 2014 -0500
  

  
Add a new feature
  

  
hello.py | 105 ++++++++++++++++++++++++-----------------
  
1 file changed, 67 insertion(+), 38 deletions(-)
  

  

  文件名后面的+-符号是这个文件相对的增加和删除行数.
  如果你想看每个commit具体修改了些什么可以使用git log -p, 结果如下:
  

commit 16b36c697eb2d24302f89aa22d9170dfe609855b  
Author: Mary <mary@example.com>
  
Date:   Fri Jun 25 17:31:57 2014 -0500
  

  
Fix a bug in the feature
  

  
diff --git a/hello.py b/hello.py
  
index 18ca709..c673b40 100644
  
--- a/hello.py
  
+++ b/hello.py
  
@@ -13,14 +13,14 @@ B
  
-print("Hello, World!")
  
+print("Hello, Git!")
  

  


shortlog
  git shortlog是一个特殊版本的git log, 他的目的是为了创建一个发布的通知. 将commit按照作者分组, 显示每个commit的第一行描述. 通过他你很容易看到谁做了些什么.
  例如, 两个开发者为一个项目贡献了5个commit, git shortlog的输出如下:
  

Mary (2):  
Fix a bug in the feature
  
Fix a serious security hole in our framework
  

  
John (3):
  
Add the initial code base
  
Add a new feature
  
Merge branch 'feature'
  

  

  默认情况下git shortlog按照作者名排序, 你可以使用-n按照每个作者的commit数量来排序.

graph
  --graph标记会画出一个ASCII图展示commit历史的分支结构. 通常和--oneline --decorate结合使用:
  

git log --graph --oneline --decorate  

  

  

*   0e25143 (HEAD, master) Merge branch 'feature'  
|\
  
| * 16b36c6 Fix a bug in the new feature
  
| * 23ad9ad Start a new feature
  
* | ad8621a Fix a critical security issue
  
|/
  
* 400e4b7 Fix typos in the documentation
  
* 160e224 Add the initial code base
  

  

  星号告诉你commit在哪一个branch上,上面的输出告诉我们23ad9ad 和 16b36c6在一个主题分支, 其它的在master分支.

自定义输出
  可以使用--pretty=format:"<string>"来自定义输出.
  例如%cn代表commiter name, %h代表commit hash的缩写,  %cd代表commiter date.
  

git log --pretty=format:"%cn committed %h on %cd"  

  

  输出如下:
  

John committed 400e4b7 on Fri Jun 24 12:30:04 2014 -0500  
John committed 89ab2cf on Thu Jun 23 17:09:42 2014 -0500
  
Mary committed 180e223 on Wed Jun 22 17:21:19 2014 -0500
  
John committed f12ca28 on Wed Jun 22 13:50:31 2014 -0500
  

  


筛选commit历史

按数量
  可以使用-n来限制输出的数量. 下面的例子只显示最近3个commit.
  

git log -3  

  


按日期
  可以使用--after或--before来按照日期筛选. 下面的例子只显示2014年7月1号之后的commit(包含7月1号).
  

git log --after="2014-7-1"  

  

  还可以使用一个相对的时间, 例如"1 week ago"和"yesterday""
  

git log --after="yesterday"  

  

  如果看某个时间段的commit可以同时使用--after和--before. 下面的例子显示2014年7月1日到2014年7月4日之间的commit:
  

git log --after="2014-7-1" --before="2014-7-4"  

  

  注意--since --until和 --after --before是一个意思.

按作者
  

git log --author="John"  

  

  显示John贡献的commit. 作者名不需要精确匹配--只需要包含就行了.
  还可以使用正则表达式. 下面的命令搜索Marry和John贡献的commit.
  

git log --author="John\|Mary"  

  

  注意这个--author不仅包含名还包含email, 所以你可以用这个搜索email.

按commit描述
  例如, 如果你的团队会在每个commit描述里面加上相关的issue号, 你可以使用下面的命令查找跟某个issue相关的commit:
  

git log --grep="JRA-224"  

  

  还可以传入-i用来忽略大小写.

按文件
  有时你可能只对某个文件的修改感兴趣, 你只想查看跟某个文件相关的历史信息, 你只需要插入你感兴趣文件的路径就可以了. 下面的例子只返回和foo.py或bar.py相关的commit:
  

git log -- foo.py bar.py  

  

  这里的--是告诉Git后面的参数是文件路径而不是branch的名字. 如果后面的文件路径不会和某个branch产生混淆, 你可以省略--.

按内容
  有时你想搜索和新增或删除某行代码相关的commit. 可以使用 -S"<string>". 下面的例子假设你想知道Hello, World!这句话是什么时候加入到项目里去的, 你可以使用下面的命令:
  

git log -S"Hello,World!"  

  

  如果你想使用正则表达式去匹配而不是字符串, 那么你可以使用-G代替-S.
  这是一个非常有用的debug工具, 使用他你可以定位所有跟某行代码相关的commit. 甚至可以查看某行是什么时候被copy的, 什么时候移到另外一个文件中去的.

按范围
  可以查看某个范围的commit:
  

git log <since>..<until>  

  

  这个命令非常有用当你使用branch做为range参数的时候. 能很方便的显示2个branch之间的不同. 看看下面的命令:
  

git log master..feature  

  

  master..feature这个range包含了在feature有而在master没有的所有commit. 如图所示(图中最下面的master..feature应该错了, 是feature..master才对):

  feature..master包含所有master有但是feature没有的commit.

过滤merge commit
  默认情况下git log会输出merge commit.  你可以通过--no-merges标记来过滤掉merge commit:
  

git log --no-merges  

  

  如果你只对merge commit感兴趣可以使用--merges:
  

git log --merges  

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-435259-1-1.html 上篇帖子: git安装使用详解 下篇帖子: Git的所有命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表