Git字符级比较:如何按比对结果过滤输出?
在Git中按字符级比对结果类型过滤输出的方法
我来帮你搞定Git字符级比对的结果过滤问题,其实利用Git本身的选项结合命令行工具就能轻松实现按类型筛选输出,具体方法如下:
1. 先开启Git的字符级比对
首先要确保你用的是字符级的diff模式,常用的命令是:
# 对两个非仓库文件做字符级比对 git diff --no-index --word-diff=char file1 file2
如果你的文件在Git仓库中,可以去掉--no-index参数。--word-diff=char会把字符级的差异用{-旧内容-}和{+新内容+}的格式标记出来。
2. 按不同结果类型过滤输出
Git的diff输出有明确的格式标记,我们可以结合grep等工具筛选需要的内容:
仅保留file1独有的行
这类行的前缀是- ,我们可以直接匹配这个前缀,同时排除diff的头部信息:
git diff --no-index --word-diff=char file1 file2 | grep -v '^diff --git' | grep '^-'
仅保留file2独有的行
和上面类似,这类行的前缀是+ :
git diff --no-index --word-diff=char file1 file2 | grep -v '^diff --git' | grep '^+'
仅保留存在字符差异的行
这类行包含字符差异标记{-、-}、{+、+},用正则匹配这些标记即可:
git diff --no-index --word-diff=char file1 file2 | grep -v '^diff --git' | grep -E '(\{-|\{\+|\-\}|\+\})'
仅保留两个文件中内容相同的行
Git默认不会输出无差异的行,所以需要先指定输出格式让相同行显示出来,再过滤掉带-/+前缀的行:
git diff --no-index --word-diff=char --unchanged-line-format='%L' --old-line-format='-%L' --new-line-format='+%L' file1 file2 | grep -v '^diff --git' | grep -v '^[-+]'
参数解释:
--unchanged-line-format='%L':指定无差异行的输出格式为原行内容--old-line-format='-%L':指定file1独有的行前缀加---new-line-format='+%L':指定file2独有的行前缀加+
3. 封装成Git别名(可选)
如果你需要频繁使用这些过滤命令,可以把它们封装成Git别名,编辑你的.gitconfig文件,添加以下内容:
[alias] # 基础字符级比对(包含所有行类型) diff-char = diff --no-index --word-diff=char --unchanged-line-format='%L' --old-line-format='-%L' --new-line-format='+%L' # 筛选file1独有的行 diff-only-file1 = "!git diff-char $1 $2 | grep -v '^diff --git' | grep '^-'" # 筛选file2独有的行 diff-only-file2 = "!git diff-char $1 $2 | grep -v '^diff --git' | grep '^+'" # 筛选有字符差异的行 diff-char-changes = "!git diff-char $1 $2 | grep -v '^diff --git' | grep -E '(\\{-|\\{\\+|\\-\\}|\\+\\})'" # 筛选内容相同的行 diff-same-lines = "!git diff-char $1 $2 | grep -v '^diff --git' | grep -v '^[-+]'"
之后你就可以用更简洁的命令调用,比如:
git diff-only-file1 file1 file2
内容的提问来源于stack exchange,提问作者Vsevolod
相关产品推荐
相关产品推荐

