在其他提交的上下文中显示 git log 中的特定提交?

Posted

技术标签:

【中文标题】在其他提交的上下文中显示 git log 中的特定提交?【英文标题】:Show specific commits in git log, in context of other commits? 【发布时间】:2020-08-14 00:42:30 【问题描述】:

使用 git log 有多种“选择”提交的方法。例如:

How to list all commits that changed a specific file? How can I view a git log of just one user's commits?

还有很多其他的。

然而,所有这些都只显示在命令行上选择的提交。我想要的是查看我范围内的所有提交,但 highlight (带有颜色、标记或其他)这些提交的特定子集,例如更改特定文件或其他内容的提交。所以在做的时候:

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

此外,ideal 解决方案适用于 --graph 模式,因为我还想查看所选提交的合并和分支上下文。

我还注意到git log 支持各种History Simplification 场景,在某些情况下这几乎可以让我得到我想要的,但很难弄清楚如何,也不是我想要的。我已经有了想要查看的历史记录,并且已经有了想要突出显示的提交。

我有一些想法,但我不喜欢其中任何一个:

编写脚本 - 运行两个 git 日志,然后使用其中一个的输出来装饰/操作另一个。这样做的缺点是它很脆弱,并且不适用于我可能提供给目标日志的不同选项集,例如--graph

对于“选定”提交,分配临时参考,例如selectedcommits 给他们,然后使用 --decorate-refs=selectedcommits 显示相关的提交。这看起来很乱。

【问题讨论】:

我认为只使用 git 是不可能的。 这将是一个不错的功能。也许您应该向 git 项目提交功能请求。 【参考方案1】:

跟进@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 默认uses LESS=FRX less 作为它的寻呼机命令,所以为了让你的hlp 别名更“原生”,我将less -R 替换为@987654330 @ 另外,使用less-pflag 来突出显示模式意味着1)第一个模式之前的行被省略,2)你受制于bug in less。因此,作为 1 和 2 的解决方法,我使用 grep 来做高亮并在最后用管道减少:hlp = "!f() GREP_COLORS=\"ms=7:\" \\grep --color=always -E \"^|$(git log --pretty=%h \"$@\" | tr '\n' '|' )\" | less -FRX; ; f" 要在hl / hlp 别名中为log 完成bash,您可以添加` : git log ; ` (reference) 刚开场后!f() 【参考方案2】:

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

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

这个想法是通过管道输出,例如,less 以突出显示特定的提交。

在 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

但是日志格式不能修改。

【讨论】:

这是一个不错的技巧!值得投票,但我还不接受:-) 为了在没有更少/分页的情况下执行此操作,您还可以将less -p 替换为grep -E --color。对于彩色输出,将--color 附加到第一个日志命令,然后将less -Rgrep --color 附加到第二个。 @Raman 如果您想将 agruments 传递给第一个 第二个 log 命令,别名将非常重要。 我添加了一个后续答案,其中包含几个专注于突出显示部分的别名,请参阅***.com/a/61525740/430128。【参考方案3】:

试试下面的 git 命令:

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

此命令将显示所有更改的文件 (--name-only)、git commit-hash (%h)、来自命令的主题(来自 git commit command 的评论 -> %s)以及由不同的颜色线。

【讨论】:

这没有回答问题。应修饰特定的提交。 @sergej 我已更改:现在它显示 这些提交的特定子集(在此提交中已更改的所有文件)或他对 "a 的含义这些提交的特定子集” ? 应显示所有提交,但应突出显示某些提交(例如涉及文件的提交)。

以上是关于在其他提交的上下文中显示 git log 中的特定提交?的主要内容,如果未能解决你的问题,请参考以下文章

git log 仅显示一个提交 ID

git篇之log

markdown 显示在特定git提交中更改的文件

markdown 显示在特定git提交中更改的文件

GIT 工作流程:将大部分功能分支合并到 master 中,省略一个特定的提交?

GIT 在特定提交之前获取提交哈希