git-log

发布时间 2023-07-13 15:24:21作者: lxd670

1.log显示参数

1-1.常规参数

-p							:按补丁显示每个更新间的差异,比下一条- -stat命令信息更全
--stat					:显示每次更新的修改文件的统计信息,每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计
--shortstat			:只显示--stat中最后的行数添加修改删除统计
--name-only			:尽在已修改的提交信息后显示文件清单
--name-status		:显示新增、修改和删除的文件清单
--abbrev-commit	:仅显示SHA-1的前几个字符,而非所有的40个字符
--relative-date	:使用较短的相对时间显示(例如:"two weeks ago")
--graph					:显示ASCII图形表示的分支合并历史(图形化显示)
--online				:一行显示,只显示哈希值和提交说明
--reverse				:以相反的顺序输出选择显示的提交,不能与--walk-reflogs结合使用。

1-2.自定义格式--pretty

1-2-1.可选项

--pretty=:使用其他格式显示历史提交信息,可选项有:oneline,short,medium,full,fuller,email,raw以及format:<string>,默认为medium,如:
--pretty=oneline:一行显示,只显示哈希值和提交说明(--online本身也可以作为单独的属性)

1-2-2.pretty%参数说明

--pretty=format:"%H"控制显示的记录格式

'%H': 提交对象(commit)的完整哈希字串
'%h': 提交对象的简短哈希字串
'%T': 树对象(tree)的完整哈希字串
'%t': 树对象的简短哈希字串
'%P': 父对象(parent)的完整哈希字串
'%p': 父对象的简短哈希字串
'%an': 作者(author)的名字
'%aN': mailmap的作者名字 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
'%ae': 作者邮箱
'%aE': 作者邮箱 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
'%ad': 日期 (--date= 制定的格式)
'%aD': 日期, RFC2822格式
'%ar': 日期, 相对格式(1 day ago)
'%at': 日期, UNIX timestamp
'%ai': 日期, ISO 8601 格式
'%cn': 提交者名字
'%cN': 提交者名字 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
'%ce': 提交者 email
'%cE': 提交者 email (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
'%cd': 提交日期 (--date= 制定的格式)
'%cD': 提交日期, RFC2822格式
'%cr': 提交日期, 相对格式(1 day ago)
'%ct': 提交日期, UNIX timestamp
'%ci': 提交日期, ISO 8601 格式
'%d': ref名称
'%e': encoding
'%s': commit信息标题
'%f': sanitized subject line, suitable for a filename
'%b': commit信息内容
'%N': commit notes
'%gD': reflog selector, e.g., refs/stash@{1}
'%gd': shortened reflog selector, e.g., stash@{1}
'%gs': reflog subject
'%Cred': 切换到红色
'%Cgreen': 切换到绿色
'%Cblue': 切换到蓝色
'%Creset': 重设颜色
'%C(...)': 制定颜色, as described in color.branch.* config option
'%m': left, right or boundary mark
'%n': 换行
'%%': a raw %
'%x00': print a byte from a hex code
'%w([[,[,]]])': switch line wrapping, like the -w option of git-shortlog(1).

1-2-3.作者和提交者的区别

作者与提交者的关系:作者是程序的修改者,提交者是代码提交人(自己的修改不提交是怎么能让别人拉下来再提交的?)

其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者(soga)

1-2-4.颜色

以这句为例:%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>
它的效果是:   
		先断句:[%Cred%h][%Creset -][%C(yellow)%d ][%Cblue%s][%Cgreen(%cd)][%C(bold blue)<%an>]
		一个颜色+一个内容,颜色以%C开头,后边接几种颜色,还可以设置字体,如果要设置字体的话,要一块加个括号
		能设置的颜色值包括:reset(默认的灰色),normal, black, red, green, yellow, blue, magenta, cyan, white.
		字体属性则有bold, dim, ul, blink, reverse.  
		内容可以是占位元字符,也可以是直接显示的普通字符

1-3.日期--date

1-3-1.可选项

--date=(relative|local|default|iso|rfc|short|raw):定制后边如果出现%ad或%cd时的日期格式
有几个默认选项
--date=relative:shows dates relative to the current time, e.g. "2 hours ago".
--date=local:shows timestamps in user’s local timezone.
--date=iso (or --date=iso8601):shows timestamps in ISO 8601 format.
--date=rfc (or --date=rfc2822):shows timestamps in RFC 2822 format,often found in E-mail messages.
--date=short:shows only date but not time, in YYYY-MM-DD format.这个挺好用
--date=raw:shows the date in the internal raw git format %s %z format.
--date=default:shows timestamps in the original timezone (either committer’s or author’s).

1-3-2.date%参数说明

也可以自定义格式(需要git版本2.6.0以上),比如--date=format:'%Y-%m-%d %H:%M:%S'会格式化成2016-01-13 11:32:13

%a:星期的缩写。
%A:星期的全名。
%b:月份的缩写。
%B:月份的全称。
%c:适用于区域设置的日期和时间表示。
%d:月中的天作为十进制数字(01 – 31)。
%H:24小时制的小时(00 – 23)。
%I:2小时格式的小时(01 – 12)。
%j:一年中的天作为十进制数字(001 – 366)。
%m:以十进制数字表示的月份(01 – 12)。
%M:分钟以十进制数字表示(00 – 59)。
%p:当前语言环境的"上午/下午",12小时制的指示器。
%S:秒作为十进制数字(00 – 59)。
%U:一年中的周为十进制数字,周日为一周的第一天(00 – 53)。
%w:工作日为十进制数字(0 – 6;星期日为0)。
%W:一年中的星期作为十进制数字,星期一作为星期的第一天(00 – 53)
%x:当前语言环境的日期表示。
%X:当前语言环境的时间表示。
%y:无世纪的年份,为十进制数字(00 – 99),也就是年份没有前两位。
%Y:带世纪的年份,以十进制数表示。
%z,%Z:时区名称或时区缩写,取决于注册表设置; 如果时区未知,则没有字符。
%%:表示百分号

1-4.范围参数

使用A...B的参数(通常使用...来比较,...相比..显示更多)

--left-right
  使用git log --left-right A...B查询时,<表示A分支的commit,>表示B分支的commit

--cherry-mark
  比较两个分支commit时,使用=标记同等的提交,用+标记不同等的提交(默认不显示符号)

--cherry-pick
  比较两个分支commit时,过滤cp相同的commit(有些cp会导致patch-id不一样,所以过滤不掉)


--left-only
--right-only
  只列出对称性差异各自一侧的提交,即只列出那些通过"--left-right"标记的<或>。
  例如,git log --cherry-pick --right-only A...B省略了B中那些在A中的提交或与A中的提交相等的补丁。
  git log --cherry-pick --right-only --no-merges A...B可以得到准确的列表。

--cherry
  --cherry A...B: 显示B分支的commit(切分支后的commit),使用=标记同等的提交,用+标记不同等的提交
  同义词: git log --right-only --cherry-mark --no-merges A...B 和 git log --cherry A...B
  有助于将输出限制在我们这边的提交,并标记那些已经应用到分叉历史的另一边的提交

2.log筛选参数

1.按数量
	-n:显示前n条log,如git log -4
	
	
2.按日期
	--after=
    比如git log --after="2023-03-01",显示2023年3月1号之后的commit(包3月1号)
    后边的日期还可以用相对时间表示,比如"1 week ago"和"yesterday",比如git log --after="yesterday"
	--before=
		同上,显示某个日期之前的commit
  2-1.另外这两条命令可以同时使用表示时间段,比如git log --after="2014-7-1" --before="2014-7-4"
  2-2.另外--since --until和 --after --before是一个意思,都可以用
  
  
3.按作者
	--author="xx",比如git log --author="John",显示John贡献的commit
  3-1.注意:作者名不需要精确匹配,只需要包含就行了
  3-2.而且:可以使用正则表达式,比如git log --author="John\|Mary",搜索Marry和John贡献的commit
  3-3.而且:这个--author不仅包含名还包含email, 所以你可以用这个搜索email


4.按commit描述信息
	--grep="",比如:git log --grep="JRA-224"
  4-1.而且:可以传入-i用来忽略大小写
	4-2.注意:如果想同时使用--grep和--author,必须在附加一个--all-match参数
	
	
5.按文件内容查找对应提交
	-S"<string>"、-G"<string>"
  5-1.有时你想搜索和新增或删除某行代码相关的commit. 可以使用这条命令
  5-2.假设你想知道Hello, World!这句话是什么时候加入到项目里去的,可以用:git log -S"Hello,World!"
  5-3.另外:如果你想使用正则表达式去匹配而不是字符串, 那么你可以使用-G代替-S.
  5-4.这是一个非常有用的debug工具, 使用他你可以定位所有跟某行代码相关的commit. 甚至可以查看某行是什么时候被copy的, 什么时候移到另外一个文件中去的
  5-5.注:-S后没有"=",与查询内容之间也没有空格符


6.按范围
	git log <since>..<until>
  6-1.这个命令可以查看某个范围的commit
  6-2.这个命令非常有用当你使用branch做为range参数的时候. 能很方便的显示2个branch之间的不同
  6-3.比如:git log master..feature,master..feature这个range包含了在feature有而在master没有的所有commit,
  		同样,如果是feature..master包含所有master有但是feature没有的commit
  6-4.另外,如果是三个点,表示或的意思:git log master...test 查询master或test分支中的提交记录
  
  
7.是否过滤掉merge commit
  —merges / --no-merges
  7-1.默认情况下git log会输出包含merge commit,你可以通过--no-merges标记来过滤掉merge commit,git log --no-merges
  7-2.如果你只对merge commit感兴趣可以使用—merges,git log --merges
  
8.按标签tag
  git log <tag_name>
  8-1.git log v1.0是查询v1.0之前的commit(到v1.0标签为止)
  8-2.加两个点:git log v1.0.. 查询从v1.0之后的提交历史记录(不包含v1.0)
  
  
9.按commit
	git log commit:查询commit之前的记录,包含commit
  git log commit1 commit2:查询commit1与commit2之间的记录,包括commit1和commit2
  git log commit1..commit2:同上,但是不包括commit1
  9-1.其中,commit可以是提交哈希值的简写模式,也可以使用HEAD代替
  9-2.HEAD代表最后一次提交,HEAD^为最后一个提交的父提交,等同于HEAD~1
  9-3.HEAD~2代表倒数第二次提交
  
  
10.查看文件的历史提交
	git log <file_name> 或者 git log -- <file_name>
    10-1.比如:git log -- a.py b.py,只返回和a.py或b.py相关的commit
    10-2.这里的--是告诉Git后面的参数是文件路径而不是branch的名字。如果后面的文件路径不会和某个branch产生混淆, 你可以省略--,比如git log a.py 
    10-3.后边的路径还支持正则,比如:git log  *install.md 是,指定项目路径下的所有以install.md结尾的文件的提交历史
  
  
11.查看其他分支的历史提交
	git log <branch> 或者 git log <branch> --
		git log A 					表示查看A分支的历史提交,和git log A --相同
    git log -- a.py 		表示查看当前分支下的a.py文件历史提交
    git log B -- a.py 	表示查看B分支下的a.py文件历史提交

3.案列

3-1.使用颜色

# 显示前3条commit
git log -3 --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:"%Cred%h%Cblack -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold cyan)<%an>"

3-2.log的范围(branch)

3-2-1.两个点和三个点的区别

git log <commit_1> 	: 从开始到这个commit_1
git log <branch_1> 	: 从开始到 branch_1的head
git log A B				 	: 既包含A,又包含B,分支和commit 同理
git log A..B				: 不包含A,包含B
	等同于git log ^A B  
git log A...B				: 包含A,不包含A和B的公共部分
	等同于git log A B --not $(git merge-base --all A B)

# 查询分支详情
git log --oneline --graph --all
* c61da3e (master) add a3.txt
* ed24f95 add a2.txt
|
| 	* 7c5fe38 (HEAD -> dev) add a3.txt
| 	* 544f42d add dev.txt
|	/
|/  
* e2fa2b7 add a1.txt
* 2b6e06c add a.txt

3-2-2.空格

会显示所有的提交

# 显示所有
git log --oneline master dev
c5fe38 (HEAD -> dev) add a3.txt
c61da3e (master) add a3.txt
ed24f95 add a2.txt
544f42d add dev.txt
e2fa2b7 add a1.txt
2b6e06c add a.txt

3-2-2.两点

只显示最后分支所拥有的commit

3-2-2-2. master..dev

显示dev的内容

git log --oneline master..dev  
7c5fe38 (HEAD -> dev) add a3.txt
544f42d add dev.txt

3-2-2-2. dev..master

显示master的内容

git log --oneline dev..master
c61da3e (master) add a3.txt
ed24f95 add a2.txt

3-2-3.三点

请注意,该命令不会返回两个分支共享的提交

可以使用--left-righ区分commit属于哪个分支的

使用--left-only--right-only可以达到..的效果

3-2-3-1. master...dev

显示两边不同的commit

git log --oneline master...dev
7c5fe38 (HEAD -> dev) add a3.txt
c61da3e (master) add a3.txt
ed24f95 add a2.txt
544f42d add dev.txt

3-2-3-2.--left-right区分

<属于master,>属于dev,

git log --oneline master...dev --left-right 
> 7c5fe38 (dev) add a3.txt
< c61da3e (HEAD -> master) add a3.txt
< ed24f95 add a2.txt
> 544f42d add dev.txt

3-2-3-3.--left-only

相当于git log --oneline dev..master

git log --oneline master...dev --left-only
c61da3e (master) add a3.txt
ed24f95 add a2.txt

3-2-3-4.--right-only

相当于git log --oneline master..dev

git log --oneline master...dev --right-only
7c5fe38 (HEAD -> dev) add a3.txt
544f42d add dev.txt

3-2-4.cherry-pick

cp(cherry-pick)过来的commit可以看做是相同的,但是有些cp冲突解决后,表示不一样

3-2-4-1.不使用--cherry-pick参数

# 默认A...B会把不是共同部分显示出来(包含了cherry-pick的commit)
git log --oneline --left-right master...dev
> 7c5fe38 (dev) add a3.txt
< c61da3e (HEAD -> master) add a3.txt
< ed24f95 add a2.txt
> 544f42d add dev.txt

3-2-4-2.使用--cherry-pick参数

# 过滤cherry-pick的分支
git log --oneline --cherry-pick --left-right master...dev
< ed24f95 add a2.txt
> 544f42d add dev.txt

3-2-5.cherry-mark

使用=标记同等的提交,用+标记不同等的提交

git log --oneline master...dev --cherry-mark
= 7c5fe38 (dev) add a3.txt
= c61da3e (HEAD -> master) add a3.txt
+ ed24f95 add a2.txt
+ 544f42d add dev.txt

4.git log和git rev-list有什么不同

1.基本上git log与git rev-list相同,但具有特殊的格式。在两者中,您git log都git rev-list可以指定格式。
2.git rev-list(至少默认情况下)只是输出提交哈希值
3.git log与git rev-list的参数也基本相同
# 默认显示commit
git rev-list master...dev
761649702320e277e04b84003fa617a7586d337c
7c5fe3819e4a65bdc8dfd635eb610371f3afd55e
c61da3e830716c796adc0a8746904c4c68092d45
ed24f95c52bae0c9caddad9b63ee7698884d4d22
544f42d10215210ba8a67e98dd4b81a9e4b0f738