如何显示HEAD之前的所有提交及各提交关联的所有分支
我明白你的需求:你想查看影响testlog文件的所有提交(从当前HEAD往前),并且每个提交旁边要显示所有包含该提交的分支(比如你希望d0e380b提交旁显示(master),因为master分支包含这个提交),而默认的--decorate选项只显示直接指向该提交的分支头,无法满足这个需求。
下面给你两个解决方案,根据你的场景选择:
方案1:强制显示所有分支的装饰信息(适合分支较少的情况)
如果你能接受显示所有分支的提交,但只过滤出修改testlog的内容,可以在原有命令基础上加上--all参数:
git log --graph --abbrev-commit --decorate --all -- testlog
这个命令会遍历所有分支的提交,但只保留修改过testlog的记录,同时--decorate会显示每个提交关联的所有直接引用(包括分支头)。不过如果你的分支很多,可能会看到一些无关的分支提交,但它们都是修改过testlog的。
方案2:自定义格式显示所有包含该提交的分支(精准需求)
如果只想查看当前HEAD往前影响testlog的提交,并且显示所有包含该提交的分支(不管分支头是否指向它),可以使用自定义git log格式,结合git branch --contains命令来获取每个提交的关联分支:
git log --graph --abbrev-commit --format='%C(auto)%h %s %d %C(reset)(%(!git branch --contains=%h --no-color | tr "\n" "," | sed "s/,$//"))' -- testlog
命令解释:
%C(auto)%h %s %d:保留默认的彩色缩写提交ID、提交信息和装饰信息(直接指向的分支/标签)%(!git branch --contains=%h --no-color | tr "\n" "," | sed "s/,$//"):调用git branch --contains=%h获取所有包含该提交的分支,用tr把换行转成逗号,sed去掉末尾多余的逗号,最后用括号包裹显示。
这个命令会精准显示你需要的内容:只看当前HEAD往前修改testlog的提交,每个提交旁都会列出所有包含它的分支(比如d0e380b旁会显示(master)如果master包含该提交)。
为什么原命令不显示master?
你之前用git log --graph --abbrev-commit --decorate testlog时,--decorate默认只显示直接指向该提交的引用(比如分支头正好在这个提交上)。如果master分支的头在d0e380b之后(也就是d0e380b是master的祖先),那么默认的--decorate不会显示master,因为master的HEAD不是直接指向这个提交。
内容的提问来源于stack exchange,提问作者jiexishede

