在其他提交的上下文中显示 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 默认usesLESS=FRX less
作为它的寻呼机命令,所以为了让你的hlp
别名更“原生”,我将less -R
替换为@987654330 @
另外,使用less
的-p
flag 来突出显示模式意味着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 -R
或grep --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 中的特定提交?的主要内容,如果未能解决你的问题,请参考以下文章