能否让git log将从master合并的变更折叠为更少行数?
问题
我参与的项目有数百名贡献者每日提交代码。在开发特性分支cshroba/my-feature-branch时,我会频繁将master分支合并进来,但使用git log --graph或git log --graph --oneline查看日志时,会显示大量master分支的提交,之后才展示我的分支变更,示例如下:
* f93e1e0f107 (HEAD -> cshroba/my-feature-branch, origin/cshroba/my-feature-branch) Merge branch 'master' into cshroba/my-feature-branch | | * 3029c915d02 (origin/master, origin/HEAD, master) someone else's commit | * 9f08e615205 someone else's commit | * 7722734920e someone else's commit | * 4eb08b2342d someone else's commit | * 15f5521b2c8 someone else's commit | * e4386c33ffd someone else's commit | * b03a944e2e8 someone else's commit | * 2a84cd2a005 someone else's commit | * 68a1f6eedd1 someone else's commit | * 3eb35aa1ae1 someone else's commit | * 1b01a894ee6 someone else's commit | * 146c3f63eaf someone else's commit | * e47660b4b21 someone else's commit | * 834f628c723 someone else's commit | * 3e6cff1c109 someone else's commit | * 67468c547cf someone else's commit | * dcb38ce901b someone else's commit (assume there are hundreds more that I'm omitting here) | * 7722734920e someone else's commit * | 61cf1c2c5a1 My change from my branch * | 8e052ed090e My change from my branch * | 94159085e8f My change from my branch * | 25935b173ad My change from my branch * | fdfb73c2877 My change from my branch * | 90294f975eb My change from my branch * | b69ed8b8ba2 My change from my branch * | 1fd4f2dc1e6 My change from my branch * | c048b4a6b93 My change from my branch * | 4567a677d9e My change from my branch |/ * c8301756fd2 The change from master that I initially branched off
我不关心master分支的具体变更,希望能将这些提交折叠为一行或几行,比如这样的效果:
* f93e1e0f107 (HEAD -> cshroba/my-feature-branch, origin/cshroba/my-feature-branch) Merge branch 'master' into cshroba/my-feature-branch | | * 3029c915d02 (origin/master, origin/HEAD, master) someone else's commit | * < 812 commits (hidden) > | * 7722734920e someone else's commit * | 61cf1c2c5a1 My change from my branch * | 8e052ed090e My change from my branch * | 94159085e8f My change from my branch * | 25935b173ad My change from my branch * | fdfb73c2877 My change from my branch * | 90294f975eb My change from my branch * | b69ed8b8ba2 My change from my branch * | 1fd4f2dc1e6 My change from my branch * | c048b4a6b93 My change from my branch * | 4567a677d9e My change from my branch |/ * c8301756fd2 The change from master that I initially branched off
解决办法
1. 用--first-parent简化日志(最直接)
这个参数让Git只追踪当前分支的直接父提交,跳过合并进来的master分支历史,只显示你的特性分支提交和合并节点。执行命令:
git log --graph --oneline --first-parent cshroba/my-feature-branch
效果:日志里只会展示你分支上的所有变更,以及每次合并master的节点,不会展开master上的其他提交。
2. 自定义折叠显示(接近示例效果)
如果想要保留master分支的首尾提交并折叠中间部分,可以通过脚本辅助实现:
- 先找到特性分支和
master的分叉点:
MERGE_BASE=$(git merge-base cshroba/my-feature-branch master)
- 计算
master从分叉点到当前的提交数:
COMMIT_COUNT=$(git rev-list --count $MERGE_BASE..master)
- 结合
git log的自定义格式,用脚本生成带折叠标记的日志(示例脚本框架):
git log --graph --oneline cshroba/my-feature-branch | awk -v count="$COMMIT_COUNT" ' /\| \* / && !seen_master_start { print $0; seen_master_start=1; printf "| * < %d commits (hidden) >\n", count-2; skip=1; } skip && /\| \* / { next } skip && !/\| \* / { skip=0; print $0 } !seen_master_start { print $0 } '
这个脚本会在master分支的第一个提交后插入折叠标记,跳过中间所有提交,直到回到特性分支的提交记录。
3. 用--simplify-by-decoration过滤重要节点
这个参数只显示带有分支、标签等标记的提交,能大幅减少无关日志:
git log --graph --oneline --simplify-by-decoration cshroba/my-feature-branch master
效果:日志里只会展示master分支头、特性分支头、合并节点以及有标签的关键提交,自动隐藏中间的普通提交。
内容的提问来源于stack exchange,提问作者Christopher Shroba
相关产品推荐
相关产品推荐

