ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用 git log 的 --left-right 与 --cherry-pick 列出两个分支之间各自独有的提交

用 git log 的 --left-right 与 --cherry-pick 列出两个分支之间各自独有的提交 文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载本指南讲解如何在日常 Git 工作流中用一条git log命令快速罗列两个分支各自独有的提交——只关心哪些提交只存在于哪一侧而不必逐个查看 diff。读完你将掌握A...B对称差集范围语法、--left-right的/标记语义、--cherry-pick对重复cherry-pick 过提交的过滤原理并能在分支、SHA、Tag 等任意两个引用之间复用这套命令组合。这些内容源自本仓库 git 目录 下的 list-different-commits-between-two-branches.md 等系列 TIL 笔记是 Git 分支对比场景的高频技巧。场景只想看提交清单不想看 diff日常开发中经常需要回答这样一个问题我的feature分支和master之间到底各自多了哪些提交常见的做法是git diff feature master但 diff 输出的是文件内容层面的差异当分支分叉已久、涉及大量文件时噪声很大。其实很多时候我们并不需要看具体改动内容只需要一份提交归属清单哪些提交只在feature上还未合并回master哪些提交只在master上feature尚未拉取这正是git log配合对称差集范围语法与几个格式化旗标可以一次性解决的问题。一条命令完成对比原 TIL 笔记给出的核心命令如下比较feature分支与master分支$ git log --left-right --graph --cherry-pick --oneline feature...master输出大致形如 a1b2c3d (feature) Add feature change 2 b2c3d4e (feature) Add feature change 1 c3d4e5f (master) Add description to README每条记录都以提交信息的第一行subject呈现行首的或标明该提交属于左侧的feature还是右侧的master。下面逐项拆解这条命令的每个组成部分。三点点记法A...B对称差集symmetric differencefeature...master中间的三个点是最关键的部分。它是 Git 的三点范围记法含义是从feature可达但不从master可达的提交加上从master可达但不从feature可达的提交即两侧各自独有提交的并集数学上的对称差集。两个分支共享的祖先提交不会出现。这与二点记法A..B有本质区别git log master..my-feature-branch只列出my-feature-branch上相对于master多出来的提交单向git log master...my-feature-branch两侧独有提交都列出来双向。仓库中的 two-kinds-of-dotted-range-notation.md 对这两种记法有完整的对照示例list-commits-on-a-branch.md 则单独讲解了二点记法在列出某分支分叉以来的全部提交场景下的用法。从这些配套笔记可以看出三点记法是想知道两侧差异全貌时的首选。--left-right用和标注提交归属有了对称差集还需要明确每个提交到底属于哪一侧这正是--left-right的职责。它的规则非常直观表示该提交只存在于左侧引用命令里写在前面的feature表示该提交只存在于右侧引用命令里写在后面的master。需要注意箭头方向完全取决于你在命令中书写引用的先后顺序。把两个引用交换为master...feature所有箭头的指向也会随之翻转——左侧变成master右侧变成feature。理解这一点在需要反向核对时就不用记两套命令。--cherry-pick剔除等价补丁的重复提交这是整条命令的灵魂旗标也是很多开发者忽略的一环。考虑一个真实场景开发者在master上修复了一个 bug然后把这个修复cherry-pick到了长期维护的feature分支上。此时两个分支上各有一个提交哈希不同、但引入的变更完全相同的提交。若不做处理它们会同时出现在对称差集输出里造成两边都有重复提交的假象。--cherry-pick的作用正是解决这个问题Git 通过比较提交的patch-id由补丁内容计算出的标识而非提交哈希来判定两个提交是否引入同一处变更。当对称差集范围内发现两侧存在补丁等价的提交时--cherry-pick会直接将其从输出中剔除。也就是说输出中只会留下真正只有一侧才有的变更而不是仅仅哈希不同的重复项。若你想保留这些等价提交、只是用标记出来则可以使用--cherry-mark旗标二者配合--left-right各有适用场景。仓库笔记 cherry-pick-a-range-of-commits.md 演示了A..B范围 cherry-pick 的边界语义下界排他、B^..D包含起始提交它与--cherry-pick旗标恰好构成操作与查看的一对前者把提交复制过去后者在对比历史时把这类复制产生的等价提交识别并隐藏起来。--graph与--oneline让输出可读--graph为提交绘制基于文本的分支拓扑图配合/标记后提交的归属和分支走向一眼可辨尤其在处理多分支合并历史时价值很大若本地残留大量已删除分支的 remote-tracking 引用图会变得杂乱可参考 clean-up-old-remote-tracking-references.md 用git fetch origin --prune清理。--oneline--prettyoneline --abbrev-commit的简写每行只输出缩写哈希与提交信息第一行保证一行一个提交便于阅读与二次处理。输出解读一个完整示例假设历史结构如下feature从master的提交M1处拉出之后master新增了M2改 READMEfeature新增了F1、F2且F1是从master上cherry-pick过来的等价提交。执行$ git log --left-right --graph --cherry-pick --oneline feature...master预期输出大致为 9e50bff (feature) Add second feature change c2880f8 (master) Add description to README 9e50bffF2只在feature上 c2880f8M2只在master上F1因与master上某提交补丁等价被--cherry-pick静默剔除不再出现在清单中。至此两侧各自独有、且变更互不重复的提交清单便一览无余。若去掉--cherry-pick重跑一遍你就能直观看到那条重复提交重新出现在哪一侧——这也是排查 cherry-pick 同步是否生效的好办法。任意两个引用都适用不止分支原笔记特别强调这套语法不限于分支名任何两个 Git 引用ref都可以# 两个 SHA 之间 $ git log --left-right --cherry-pick --oneline 3f2a1b0...8d9c7e6 # 分支与 Tag 之间 $ git log --left-right --cherry-pick --oneline v1.2.0...feature # 本地分支与远程跟踪分支之间 $ git log --left-right --cherry-pick --oneline origin/main...HEADGit 的范围语法本身接受任意 rev 表达式因此对比谁和谁的灵活性完全取决于你的需要命令骨架始终不变。实用变体与进阶快速统计两侧提交数量如果只想快速知道左右各有多少独有提交可以交给git rev-list$ git rev-list --left-right --count feature...master输出两个数字左侧为feature独有提交数右侧为master独有提交数。这在合并前评估分叉规模、或者在脚本里做自动化判断如右侧领先超过 N 个提交就提醒拉取时非常实用。只看某一侧--left-only/--right-only对称差集默认两侧都输出。若只想确认我这边还有哪些没合上去或上游新增了哪些可分别使用--left-only仅左侧与--right-only仅右侧进一步收窄范围配合--oneline即可得到单侧变更清单。与二点记法的选型想知道我的分支相对基线多了什么git log base..my-branch --oneline单向见 list-commits-on-a-branch.md想知道两侧各自独有、含 cherry-pick 去重git log --left-right --graph --cherry-pick --oneline base...my-branch双向即本文主命令。两者互补二点记法回答推进了多少三点记法回答差异全貌。关联技巧速览同样沉淀在 git 目录 的几则相关笔记可以与本技巧组合使用transition-a-branch-from-one-base-to-another.md用git rebase --onto把分支整体换基先看差异再决定是否换基是完整的工作流闭环check-what-branches-contain-a-specific-commit.md从单个提交反查它出现在哪些分支与按分支列提交互为逆向视角list-and-count-all-posts-in-til-repo.md本仓库自身的提交/文件统计示例可用于验证上述命令在真实仓库上的输出格式。小结git log --left-right --graph --cherry-pick --oneline refA...refB是一条高信息密度、低噪声的分支对比命令三点记法圈定对称差集--left-right标注归属方向--cherry-pick依据 patch-id 等价性剔除跨分支复制产生的重复提交--graph与--oneline保证输出可读。把它与二点记法、--left-right --count、--left-only/--right-only等变体配合使用足以覆盖绝大多数两个引用之间发生了什么的日常核查需求。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐怎么用 Ryujinx 运行 Switch 游戏从安装到稳定帧的新手实操指南怎么用 Ryujinx 运行 Switch 游戏从安装到稳定帧的新手实操指南 先给一句话定位 Ryujinx 是一款开源、免费的 Nintendo Swit文档教程知识库30-seconds-of-code Git 技巧Cherry-pick 一个不属于任何分支的 GitHub 提交30 seconds of code Git 技巧Cherry pick 一个不属于任何分支的 GitHub 提交 在基于远程仓库协作时你可能会遇到这样一个教程文档git-extras 的 git missing精准查看两个分支之间缺失提交的命令行指南git extras 的 git missing精准查看两个分支之间缺失提交的命令行指南 导读 git missing 是 git extras 工具集中用于开发工具CLI版本控制上一篇FLOCI Transfer Family 模拟指南AWS Transfer Family 管理平面 API 的本地仿真与实战下一篇5分钟搞定SOCD键盘重映射免费开源Hitboxer让方向键不再打架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表