如何在git log中显示特定的提交记录,并涵盖其他提交记录的上下文?

7

有许多方法可以使用 git log 选择提交记录。例如:

还有许多其他方法。

然而,所有这些方法都仅在命令行中选择特定提交记录。我的需求是要查看指定范围内的所有提交记录,但 突出显示(使用颜色、标记或其他方式)其中特定的一部分提交记录,例如更改了特定文件的提交记录等。因此,当执行以下操作时:

git log --oneline master..@ -- path/to/frobnitz

不要看到:

12ca6d863 foo
6166da1fd bar
894567343 baz

我会看到类似这样的东西:
46984ad11 (HEAD -> master) git is fun!
2e11a5382 cool beans
>> 12ca6d863 foo
60069036d whatever
d698663d0 something
>> 6166da1fd bar
3d2c811e3 more cool stuff
>> 894567343 baz
3d2c811e3 cool stuff

此外,理想的解决方案应该与--graph模式一起使用,因为我也想看到所选提交的合并和分支上下文。

我还注意到,git log支持各种历史简化场景,在某些情况下可以实现我想要的结果,但很难弄清楚如何做,而且并不完全符合我的要求。我已经有了我想要看到的历史记录,并且我已经有了我想要突出显示的提交。

我有一些想法,但都不太满意:

  • 将它脚本化--运行两个git日志,然后使用其中一个的输出来装饰/操作另一个。这种方法的缺点是它很容易出错,并且对于我可能提供给目标日志的不同选项集合,它不会很好地工作,例如--graph

  • 对于“已选择”的提交,将临时引用(例如selectedcommits)分配给它们,然后使用--decorate-refs=selectedcommits来显示相关提交。这看起来很混乱。


我认为单独使用Git是不可能的。 - sergej
那将是一个不错的功能。也许你应该向Git项目提交一个功能请求。 - sergej
3个回答

6

只是为了好玩,等待更好的答案。

git log --oneline --decorate=no --graph | less -p $(git log --pretty=%h -- Makefile | tr '\n' '|')

这个想法是将输出通过例如less来突出显示特定的提交。

enter image description here

在Linux的bash和Windows的git-bash中测试通过。

这里是第一个别名的尝试:

[alias] hl-graph = !git log --oneline --graph --color | less -R -p $(git log --pretty=%h \"$@\" | tr '\n' '|') && :

要突出显示的提交可以像平常一样定义:

 git hl-graph --since="1 month ago" -- path/to/frobnitz

然而,日志格式无法修改。


1
这是一个很棒的技巧!值得点赞,但我暂时不接受它 :-) - Raman
1
如果不使用 less/paging,您也可以将 less -p 替换为 grep -E --color。对于彩色输出,请在第一个日志命令后添加 --color,并在第二个命令中使用 less -Rgrep --color - Raman
@Raman 如果你想将参数传递给第一个和第二个日志命令,那么别名将是非平凡的。 - sergej
我已经添加了一个后续答案,其中包含一些专注于高亮部分的别名,请参见 https://dev59.com/hbroa4cB1Zd3GeqPpK0c#61525740。 - Raman

2

继续@sergej的答案(点赞它!),并且认识到需要别名的重复部分其实只是突出显示,我已经配置了以下别名:

  hl = "!f() { cd -- ${GIT_PREFIX:-.}; grep --color -E \"$(git log --pretty=%h \"$@\" | tr '\n' '|')\" || true; }; f"
  hlp = "!f() { cd -- ${GIT_PREFIX:-.}; less -R -p $(git log --pretty=%h \"$@\" | tr '\n' '|'); }; f"

这些命令可通过将任何日志命令的输出导入该别名来使用。例如:

git log --oneline --graph --color | git hl --since="1 month ago" -- path/to/frobnitz

(或者对于分页版本,使用hlp

嗨@Raman,只是想提醒一下,默认情况下Git使用LESS=FRX less作为其分页器命令,所以为了让你的hlp别名更具“本地”感觉,我用less -FRX替换了less -R - philb
此外,使用 less-p 标志来突出显示模式意味着 1) 忽略第一个模式之前的行,2) 您会遇到 less 中的错误。因此,为了解决问题 1 和 2,我使用 grep 进行高亮,并在最后将其管道传递给 less:hlp = "!f() { GREP_COLORS=\"ms=7:\" \\grep --color=always -E \"^|$(git log --pretty=%h \"$@\" | tr '\n' '|' )\" | less -FRX; }; f" - philb
要在hl/hlp别名中为log获得bash完成,您可以在开头的!f() {之后添加:git log;参考)。 - philb

0

尝试以下git命令:

git log --name-only --pretty=format:"%h %s" --graph

这个命令将显示所有已更改的文件(--name-only),Git 提交哈希值(%h),从命令中提取的主题(来自git commit command 的注释 -> %s),以及由不同颜色线条绘制的分支。

enter image description here


3
这并没有回答问题。需要对具体的提交进行注释。 - sergej
@sergej,我已经更改了:现在它显示了这些提交中更改的特定子集(所有在此提交中更改的文件),或者他用“这些提交的特定子集”是什么意思? - SwissCodeMen
2
所有提交都应该显示出来,但是一些提交(例如涉及到某个文件的提交)应该被突出显示。 - sergej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接