0


git log 过滤

git log命令主要用于查看Git版本演变历史(也就是提交历史),同时根据追加的参数和选项不同,也会有不同的展示效果。

git log命令说明

git log官方文档说明

git log用于查询版本的历史,命令形式如下:

git log [<options>][<since>..<until>][[--]<path>...]

列出可以从给定的提交中通过 "父 “链接到达的提交,但不包括可以从前面有”

^

"的提交中到达的提交。 默认情况下,输出结果是按时间顺序倒置的。

你可以把它看成是一个集合操作。从命令行上给出的任何一个提交中可以到达的提交形成一个集合,然后从这个集合中减去任何一个前面带有

'^'

的提交。 剩下的提交内容就是命令的输出结果。 其他各种选项和路径参数也可以用来进一步限制结果。

不带参数

  • 如果不带任何参数,它会列出所有历史记录,最近的排在最上方,显示提交对象的哈希值,作者、提交日期、和提交说明
  • 如果记录过多,则按上下键,Enter(向下显示一行),空格(显示下一页),来控制显示。
  • q键退出历史记录列表。

按照数量过滤

使用

git log

命令时最基本的过滤方式就是按照可以显示的日志条数进行过滤。如果你只对最近几次提交感兴趣,这会节省在页面上查看所有提交的麻烦。

git log -3

按照日期过滤
如果你想查找特定时间段的提交历史,可以使用

--after

或者

--before

选项来通过日期过滤显示内容。这两个选项的值都可以接收不同形式的日期格式。比如下面的命令只显示2014年7月1日以及之后的提交历史信息。

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

也可以传递相对时间比如

"1 week ago"

表示一周前或者

"yesterday"

表示昨天:

git log --after="yesterday"

如果想寻找时间区间内的提交历史,可以同时使用

--before

--after

选项。比如为了显示2018年7月1日到2018年7月4日之间提交可以向下面这样执行命令:

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

此外需了解的是,

git log

命令中还可以使用

--since

--until

选项,他们分别是

--after

--before

的同义词。

按作者和提交者过滤

如果想查找某个特定作者的提交历史,可以使用

--author

选项。该选项接受一个正则表达式,并且返回所有作者字段符合正则表达式的提交记录。当然如果你知道作者确切的名称,也可以直接传入一个普通字符串而无需使用正则表达式:

git log --author="John"

这条命令会显示所有由

John

提交的记录。作者名称并不是必须完全一致,检索时会匹配包含给定参数的提交记录。

你也可以通过使用正则表达式来构建更加复杂的搜索方式。比如下面的例子就会去搜索

Mary

或者J

ohn

提交的记录。

git log --author="John|Mary"

请注意在作者字段中也包含提交者的

email

值,所以你也可以使用此选项来搜索特定

email

地址。

如果你的工作流程区分提交人和作者,那么

--committer

选项操作也类似。

按照提交信息过滤

如果想按照提交信息过滤提交记录,可以使用-

-grep

选项。它的工作方式与

--author

选项一致,只不过搜索的目标是提交信息而不是作者信息,仅显示提交说明中包含指定字符串的提交。

比如说你的团队规定提交信息中要包含对应的

issue

信息,那么就可以使用类似下面的命令来根据issue信息查找特定提交:

git log --grep="JRA-224:"

在使用时可以考虑传递

-i

选项让

git log

查找提交记录时忽略大小写。
**注意:如果想同时使用

--grep

--author

,必须在附加一个

--all-match

参数。**

按照文件过滤

很多时候,你可能只关心含有特定文件变更的提交。要想显示所有与这个文件相关的提交记录,那么可以将文件路径作为参数传递给

git log

命令。比如下面的例子会返回所有与

foo.py

bar.py

文件有关的提交记录。

git log -- foo.py bar.py
-(空格)文件或--[后边没有文件]

这里的

--

是告诉

Git

,后面的参数是文件路径而不是

branch

分支)的名字。 如果后面的文件路径不会和某个

branch

产生混淆,你可以省略

--

,比如

git log foo.py


后边的路径还支持正则,比如:git log *install.md ,是指定项目路径下的所有以

install.md

结尾文件的提交历史。
文件名应该放到参数的最后位置,通常在前面加上

-

-并用空格隔开表示是文件。

git log file/

可以查看

file

文件夹下所有文件的提交记录。

按照提交内容过滤

想要按照提交的具体内容来过滤提交记录,也是可以办到的。比如有时候你想知道添加或者删除某行代码的提交,可以使用

-S

这样的参数。

log log -S"<string>"git log -G"<string>"#仅显示添加或删除内容匹配指定字符串的提交。

有时你想搜索,新增或删除某行代码相关的

commit

. 可以使用这条命令。

设你想知道

Hello,World!

这句话,是什么时候加入到项目里去的,可以用:

git log -S"Hello,World!"

如果想以正则表达式进行搜索,而不是通过字符串,那么可以修改一下上面的命令,改为传入

-G

这样的参数。

这是一个非常有用的

debug

工具,使用他可以定位所有跟某行代码相关的

commit

,甚至可以查看某行是什么时候被

copy

的,什么时候移到另外一个文件中去的。
注意:-S后没有"=",与查询内容之间也没有空格符。

按照提交区间过滤

你可以向

git log

命令传递一个表示提交之间的区间来筛选仅在这两次提交之间的所有提交记录。对于区间的表示如下所示:

git log ..git log <since>..<until>

这个命令对于查找两个分支之间的区别非常有用。考虑下面这个命令:

git log main..feature
main..feature

这个提交区间的表述,会给出所有已经存在于

feature

分支但还不存在于

main

分支的提交记录。换句话说,也就是

feature

分支已经距离

main

分支有多远了。
请注意如果你对调区间的两端

(feature..main)

,你会得到所有已经存在于

main

分支但还未存在

于feature

分支的提交记录。如果

git log

命令在执行这两个区间时都有返回,那么也就意味着你的提交历史已经分叉了
如果是三个点,表示或的意思:

git log master...test

,意思是查询

master

test

分支中的提交记录。
官网说明

<提交 1>…​<提交 2>

,对合并很有用。 由此产生的提交集合是两个操作数之间的对称差。 以下两个命令是等价的:

$ git log A B --not$(git merge-base --all A B)
$ git log A...B

过滤合并提交

git log

命令默认会含有合并提交。但是如果你的团队策略是“总是使用合并”(比如说总是在功能分支使用

merge

来整合上游分支的新变更,而不是将功能分支

rebase

到上游分支上),那么项目提交历史中会有大量冗余的合并提交节点。

通过传入

--no-merges

选项,可以让

git log

命令的输出过滤掉那些合并提交:

git log --no-merges

另外一方面,如果你只对合并提交感兴趣,也可以使用

--merge

选项

git log --merges

这会输出所有含有两个及以上分支的提交记录。

按标签tag

git log --tages=v1.0

直接这样是查询标签之前的commit。
加两个点,例如:

git log --tages=v1.0..

,是查询从v1.0以后的提交历史记录(不包含v1.0)。

按分支

git log  --
--branchName

branchName参数:为任意一个分支名字,查看某个分支上的提交记录。

需要放到参数中的最后位置处。

如果分支名与文件名相同,系统会提示错误,可通过–选项,来指定给定的参数,是分支名还是文件名。

比如:在当前分支中有一个名为v1的文件,同时还存在一个名为v1的分支。如下:

git log v1 -- #此时的v1代表的是分支名字(--后边是空的)。git log -- v1 #此时的v1代表的是名为v1的文件。git log v1 -- v1 #代表v1分支下的v1文件。

按commit

git log commit #查询commit之前的记录,包含commit。
git log commit1 commit2 #查询commit1与commit2之间的记录,包括commit1和commit2。
git log commit1..commit2 # 同上,但是不包括commit1。

说明:

  1. 其中,commit可以是提交哈希值的简写模式,也可以使用HEAD代替。
  2. HEAD代表最后一次提交,HEAD^为最后一个提交的父提交,等同于HEAD~1
  3. HEAD~2代表倒数第二次提交。
标签: git

本文转载自: https://blog.csdn.net/qq_44732146/article/details/139878202
版权归原作者 胡八一、 所有, 如有侵权,请联系我们删除。

“git log 过滤”的评论:

还没有评论