简介

difft(Difftastic) 是一个根据文件语法进行差异分析的结构化比较工具。

Difft 的原理是使用 Tree-sitter 来构建解析树,然后将解析树转换为一个更简单的树,可以进行差异比较。这里简单了解一下 Tree-sitter: 它是一个用于解析源代码的现代解析器生成工具和库,它可以将源代码解析为抽象语法树(AST),使程序能够理解和处理源代码的结构和语法。

首次用户

  1. 使用 x difft 即可自动下载并使用

    • 在终端运行 eval "$(curl https://get.x-cmd.com)" 即可完成 x 命令安装, 详情参考 x-cmd 官网
  2. x-cmd 提供1分钟教程,其中包含了 difft 命令常用功能的 demo 示例,可以帮你快速上手 difft 。

  3. 使用案例:

    difft-1min-cn

    # 比较两个目录的差异
    $ x difft path/dir_1 path/dir_2
    
    # 比较两个文件的差异
    $ x difft path/file_1 path/file_2
    
    # 使用 difft 比较 git 的提交日志
    $ GIT_EXTERNAL_DIFF=difft git log -p --ext-diff
    

更精准的语法高亮

  1. difft 可以根据文件的语法比较文件的不同之处并进行高亮显示,但如果一个文件的扩展名不能识别的话,difft 使用的是带有单词高亮的文本差异比较。若要查看 difft 支持哪些语言,可以点击这个链接查看 difft语言支持
  2. 支持仅检查两个文件是否具有相同的语法结构,而不进行差异计算

支持在 git 命令中使用 difft 来比较

  1. 当前环境使用: 可以通过设置环境变量 GIT_EXTERNAL_DIFF (GIT_EXTERNAL_DIFF=difft git diff)然后在当前环境使用 git diff 即可
  2. 全局配置: 如果您想默认使用 difftastic,可以使用 git config 进行配置。具体操作方式可以在这里查看

除 git 以外,difft 还支持 Mercurial 和 Fossil(Mercurial 和 Fossil 都是版本控制系统)

已知问题

  1. difft 在比较大文件上的性能较差,并且有可能会占用大量的内存,详情请看这里

竞品和相关作品

以下 cli 项目也是基于树进行结构差异分析:

  1. json-diff 比较 JSON 文件的结构 diff
  2. GumTree 解析多种编程语言,然后执行基于树的 diff,输出 HTML 显示。
  3. Diffsitter 一个基于树的比较工具。
  4. Autochrome 是一个用于在结构上比较和突出显示 clojure 源代码的程序。
  5. graphtage 通过解析为通用文件格式,然后显示差异来比较结构化数据,允许将 JSON 与 YAML 进行差异。

进一步阅读

  • 项目托管在 GitHub 上,里面的 README 文档提供了详细的参数功能和使用说明。
  • 官方提供了详细的 manual 文档,该文档对 difft 的解析进行了详尽的说明。
  • 如果你是 magit 用户,你可以参考 difftastic-diffing-with-magit,将 difftastic 与 magit 一起使用。

X-CMD 官网

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐