如何用Git内置选项获取两分支同文件的删除行并转为Plumbing输出?
解决方法
首先,你之前用--diff-filter=D不生效的原因是:这个参数是用来过滤整个文件被删除的场景,而你的情况是文件存在但内容有行被删除(属于文件修改状态M),因此该参数无法匹配到目标文件。另外,你期望获取dev分支相对于feature分支中被删除的行,需要注意分支对比顺序——git diff A B展示的是从A到B的变更,所以要看到dev到feature的删除行,应该用git diff dev feature而非feature dev。
Git没有直接的单一内置选项可以一步到位仅输出文件内的删除行,但可以通过以下方式实现,尽量依赖Git自身功能:
方法1:补丁格式输出+过滤删除行
使用补丁格式输出,并过滤掉diff头部信息,只保留删除行:
git diff --unified=0 --no-prefix --no-color dev feature -- object.json | grep '^-' | grep -v '^---'
--unified=0:取消上下文行,只显示变更行--no-prefix:去掉文件名前缀(如a/、b/)--no-color:关闭颜色输出,方便后续处理- 最后的
grep过滤掉diff头部的---行,只保留以-开头的删除行
方法2:使用Plumbing命令组合
如果更倾向于Git Plumbing底层命令,可以结合git cat-file获取文件内容,再用git diff --no-index对比:
git diff --no-index <(git cat-file blob dev:object.json) <(git cat-file blob feature:object.json) | grep '^-' | grep -v '^---'
git cat-file blob dev:object.json:直接获取dev分支中object.json的内容git diff --no-index:对比两个本地文件(这里用进程替换生成临时内容)
需要注意的是,目前Git没有内置的行级过滤参数,所以必须借助grep这类工具来筛选删除行,无法完全脱离外部工具实现。
内容的提问来源于stack exchange,提问作者lem
相关产品推荐
相关产品推荐

