代码对比

代码对比,是把两份源码逐行比较、按语言语法高亮,并标出新增、删除、修改行的在线工具。本工具免费、无需注册,全程在浏览器本地完成(差分用 jsdiff,高亮用 Prism 语法定义),代码不上传,适合核对同事改了哪几行。支持并排双栏与统一 diff 两种视图,未改动代码自动折叠,可忽略注释、缩进与行尾空白,能导出 .patch 补丁。它比的是字面差异,不理解语义。

视图

当前是纯文本模式,需要先选定语言才能识别注释,「忽略注释」暂不可用。

请在左右两侧分别粘贴要对比的代码。

🔒 两份代码都在你的浏览器里对比,代码不上传、也不会被执行;关掉页面就没了。本工具比的是字面差异,不理解语义:变量重命名、格式化重排都会被算成改动。

如何使用代码对比

1

左边贴旧版代码、右边贴新版代码;两个文件代码对比也可以直接把源码文件拖进来,认扩展名自动选语言。代码不上传,全在浏览器本地对比。

2

语言默认自动识别,也可以手动选 JavaScript、TypeScript、Python、Java、Go、SQL 等 15 种之一;再按需勾选忽略注释、忽略缩进、忽略行尾空白。

3

看高亮结果:未改动的代码默认折叠、只留 3 行上下文,点「展开」看全文,也可以在并排双栏和统一 diff 两种视图之间切换。

4

用统计条确认改了几行、几处变更块,需要留档就点「复制统一 diff」或「下载 .patch」。

关于代码对比的常见问题

代码对比会上传代码吗?在线代码对比工具安全吗?
不上传,也不执行。两份代码从粘贴到出结果都在你的浏览器里完成:差分用 jsdiff 这个纯 JS 库在本地算,语法高亮用 Prism 的语法定义做字符串分词,两者都不需要联网、更不会把代码发到任何服务器。工具不会 eval 你的代码,也不会把它拼成 HTML 插进页面,所以粘一段带脚本标签的前端代码进来也只是当文本显示。关掉页面内容就没了,本机只留语言、视图这类展示偏好。
代码对比支持哪些语言的语法高亮?
目前支持 15 种:JavaScript、TypeScript、JSON、HTML / XML、CSS、Python、Java、Go、C / C++、C#、PHP、Rust、SQL、Shell / Bash、YAML,另外还有一档纯文本(不高亮)。语言默认自动识别,识别不出就按纯文本处理、不瞎猜,你随时可以在下拉里手动改。要说明的是着色依据的是 Prism 的语法定义,对 Vue 单文件、SCSS、各家 SQL 方言这类写法可能着色不准;但着色只影响颜色,代码差异对比的结果不受它影响。
代码对比能忽略注释和缩进吗?
能,而且是三个独立开关:忽略注释、忽略缩进、忽略行尾空白(行尾空白默认就开着,它几乎总是噪音)。要留意「忽略注释」的准确口径:它把注释的内容从判等里拿掉,但注释所占的那一行仍然占位,跨行的块注释也按原来的行数留空。所以只勾忽略注释,整行注释还会显示成一处增删;想彻底消除,再把「忽略空行」一起勾上。另外这个开关依赖语言识别,纯文本模式下不可用。还要说明的是,代码对比忽略空格并不是一个开关:它拆成了只管行首的「忽略缩进」和只管行尾的「忽略行尾空白」,行中间的空格差异一律照实算成改动。
代码对比怎么只看改动的部分?
未改动的代码默认就是折叠的,只在每处改动上下各留 3 行上下文,中间会显示一条「折叠了 N 行未改动代码」,点一下就展开。上下文行数可以在 0、3、5、10、全部展开之间切换:选 0 就只剩变更行,选「全部展开」就完整显示两份代码。改动多的时候用「上一处差异 / 下一处差异」在变更块之间跳,统计条上的「几处变更块」就是跳转的总数。差异特别多时页面只渲染前 4,000 行,导出的补丁仍然是完整的。
手机上能做代码对比吗?代码对比工具要装软件吗?
可以,不用装任何软件或插件。代码对比是纯网页实现,手机、平板、电脑浏览器打开就能用。窄屏下两个输入框会改成上下堆叠,视图首帧自动切到统一 diff(并排双栏在手机上一行塞不下),代码区可以横向滚动,也可以勾「长行折行」让长行自动换行。复制走系统剪贴板,剪贴板不可用时会提示你手动选中,不会静默失败。
压缩过的代码对比不出来怎么办?
压缩后的 min.js、min.css 常常整份只有一两行、单行几十万字符,逐行 diff 对它没有意义——两份只要有一个字节不同,就是「这一行变了」。本工具对超过 5,000 字符的单行会跳过分词与行内高亮(否则浏览器会卡住),只按纯文本比较并给出提示。正确做法是先用本站的 JS 格式化、CSS 格式化或 HTML 格式化把它展开成正常缩进,再回来对比,这样才能看清到底改了哪几行。
代码对比能导出 patch 补丁吗?两个版本代码对比后怎么留档?
能。结果区有「复制统一 diff」和「下载 .patch」两个按钮,输出的是标准 unified 格式(带 @@ 行号头),上下文行数跟随你选的设置,选「全部展开」时按 3 行输出。补丁一律以两侧原文为准生成,所以忽略注释、忽略缩进、忽略大小写这些开关不会影响导出内容——它们只影响页面上判等,不会改写你的代码。补丁头两行固定写成 a/code 与 b/code(两侧同名,git apply 才不会把它当成改名而报错),不是你真实的文件名,要打回项目里先把这两行换成自己的路径。想留档就把这个 .patch 存下来或贴进评审记录。

支持语法高亮的 15 种语言与扩展名对照

本工具支持语法高亮的 15 种语言是:JavaScript、TypeScript、JSON、HTML / XML、CSS、Python、Java、Go、C / C++、C#、PHP、Rust、SQL、Shell / Bash、YAML,另有一档纯文本只比差异、不着色;每种语言认哪些扩展名见下表。

这件事在中文里有好几种叫法:代码对比、代码 diff、代码差异对比、代码比对工具、代码文件对比、两份代码对比,说的都是同一件事——把两份源码逐行比出哪里不一样;英文站点上的 code diff online、compare code online、online diff tool 找的也是这类工具,并排那种视图英文里通常写作 side by side diff。这个在线代码对比工具不必装 Git、不必注册,代码对比在线打开就能用:diff 在线对比代码、js 代码对比、python 代码对比、sql 语句对比都在同一个页面里,也就是一个不用配置的在线 diff 工具。下表是本代码对比工具认识的语言与常见扩展名,数据取自站内数据表(复核于 2026-08-30),页面不手写第二份。

本工具支持语法高亮的语言与常见扩展名(复核于 2026-08-30)
语言常见扩展名
JavaScript.js .mjs .cjs .jsx
TypeScript.ts .tsx .mts
JSON.json .jsonc .json5
HTML / XML.html .htm .xml .vue .svg
CSS.css .scss .less
Python.py .pyw
Java.java
Go.go
C / C++.c .h .cpp .cc .hpp
C#.cs
PHP.php
Rust.rs
SQL.sql
Shell / Bash.sh .bash .zsh
YAML.yml .yaml

语言默认自动识别:两侧内容各按一张特征打分表算一次分,取合计最高的那一种,分数不够就判纯文本、不猜。识别只决定默认值,你随时可以手动改;选错了也只是着色不准,代码差异检查的结果不受影响。

代码对比里各语言的注释写法对照表

下表按语言列出行注释、块注释与文档注释三种写法,勾上「忽略注释」时被拿掉的就是这几类内容。但真正做判定的不是这张表里的符号,而是 Prism 的语法定义——所以写在字符串里的注释符(比如 一行 JS 里的 const s = 双引号包着的两根斜杠)不会被当成注释,跨行的块注释也能整段认出来。

各语言的行注释、块注释与文档注释写法(展示口径,实际判定由语法定义完成)
语言行注释块注释文档注释扩展名
JavaScript// 注释/* 注释 *//** JSDoc */.js .jsx .mjs
TypeScript// 注释/* 注释 *//** TSDoc */.ts .tsx
JSON.json
HTML / XML<!-- 注释 -->.html .xml .svg
CSS/* 注释 */.css .scss
Python# 注释—(三引号串是字符串,不是注释)"""文档字符串""".py
Java// 注释/* 注释 *//** Javadoc */.java
Go// 注释/* 注释 */// 紧贴声明的行注释.go
C / C++// 注释/* 注释 *//** Doxygen */.c .h .cpp
C#// 注释/* 注释 *//// XML 文档注释.cs
PHP// 注释 或 # 注释/* 注释 *//** PHPDoc */.php
Rust// 注释/* 注释 *//// 文档注释.rs
SQL-- 注释/* 注释 */.sql
Shell / Bash# 注释—(惯用 here-doc 变通).sh .bash
YAML# 注释.yml .yaml

忽略注释、忽略缩进到底忽略了什么

所有忽略开关都只影响判等:视图里显示的、导出的补丁里写的,一律是你贴进来的原文。 代码对比忽略注释这件事最容易被误解,这里把三个开关的口径写清楚。

七个开关各自忽略什么、默认状态与要注意的地方
开关忽略什么默认注意
忽略注释注释的内容不参与判等注释所在的行仍然占位(块注释按原行数留空),要彻底消除需并用「忽略空行」;纯文本模式下不可用
忽略缩进行首的空格与制表符整体多包一层 if 时特别有用,只剩真正新增的那几行
忽略行尾空白行末的空格与制表符几乎总是噪音,所以默认打开
忽略空行纯空行不参与差分被跳过的空行不显示,但保留下来的行号仍是原文真实行号
忽略换行符差异CRLF / CR 统一成 LF关掉后 Windows 与 Unix 换行会让整篇标成全变
忽略大小写判等时统一小写代码大小写有意义,一般不需要开
tab 宽度把行首 tab 按该宽度展开后再比4 空格制表符缩进与 4 空格缩进在这一档下判等;改成 2 就算差异

行号永远是原文真实行号:勾了忽略空行之后,被跳过的空行不再显示,但剩下那些行标的仍然是它们在原文件里的行号, 不会整体前移——这是照着补丁改代码时最要紧的一条。

各语言做代码对比时容易踩的坑

同一组忽略开关,换个语言合不合适就变了——缩进在 Python 里决定代码块归谁,在 Java 里只是排版。下表按语言列出最容易被误判成「改了」或「没改」的地方,以及建议的开关组合。

按语言给出的易误判点与建议开关组合
语言容易误判的地方建议怎么设
Python缩进决定语句属于哪个代码块,开「忽略缩进」会把真实的层级调整判成没变别开忽略缩进;制表符与空格混用时改 tab 宽度对齐就够
YAML同理,缩进就是结构本身,少两个空格就是换了一层同样别开忽略缩进,先确认两侧用的是同一种缩进宽度
JavaScript打包压缩后整份只有一两行,逐行比等于「整份都变了」先用 JS 格式化展开成正常缩进,再回来做 js 代码对比
JavaJavadoc 大段重写时,逻辑改动会淹没在注释差异里Java 代码对比先勾忽略注释看逻辑,再关掉核对注释本身
HTML / XML属性换行位置、自闭合写法不同,会让没改过的整段也标红HTML 代码对比前先用 HTML 格式化把两侧统一成同一种风格
CSS只是调换了属性顺序,字面 diff 照样算成一删一增先把两侧格式化成同一风格,再看剩下的真实改动
SQL关键字大小写风格不统一,整篇都是差异sql 语句对比时开忽略大小写;但要先确认库里的标识符本身不区分大小写
Gogofmt 已经把格式统一了,格式类噪音本来就少照默认设置比即可,剩下的差异基本都是真实改动

代码对比忽略大小写这一档要按语言想清楚:SQL 里 SELECT 和 select 是同一个关键字,开着它能省掉一大片假差异;但 Go、Java 里 Name 和 name 是两个不同的标识符,开着它反而会把真实改动一起吞掉。

代码对比看不出来的几件事

本工具做的是字面差异对比,不理解语义。下面这几种情况它给不出你想要的答案,说清楚比含糊过去有用。

字面对比的四个盲区与建议动作
情况会看到什么建议怎么办
变量或函数改名每一处出现都算成修改行先在编辑器里做重命名重构,再对比剩下的真实改动
格式化重排(换行、缩进整体变了)几乎整篇都标成改动先用本站的 JS 格式化 / CSS 格式化 / HTML 格式化把两份统一成同一种风格再来对比
编码或 BOM 不同首行看起来一样却判为不同本工具会自动剥掉开头的 BOM;仍有乱码就说明两份文件编码不一致,先统一成 UTF-8
压缩过的一整行 min.js超过 5,000 字符的单行不分词、不做行内高亮先格式化展开再对比

还有一条要讲清楚:代码对比相似度是行级口径,算的是「未改动行数 ÷ 两侧行数的较大者」,结果保留一位小数。举个具体的:旧版 40 行、新版 44 行、其中 36 行一个字符都没动,统计条上就是 36 ÷ 44 ≈ 81.8%,分母取的是较大的那个 44 而不是 40。它用来快速判断改动幅度,不是代码查重率,也不做语义相似度判定,别拿它当抄袭证据。

并排双栏和统一 diff 怎么选

两种视图看的是同一份结果,只是排布不同。代码对比并排显示时左右各带行号,删除行只占左列、新增行只占右列,修改行左右并排,代码对比高亮会在行内再标出具体改了哪几个 token,适合宽屏细看;统一 diff 是一栏、用加号减号前缀,和 git diff 的样子一致,适合窄屏和贴进评审记录。两种视图都不只靠颜色区分增删,行首还有加减号角标,方便色觉障碍的同学分辨。

代码对比折叠未改动的部分是默认行为,展开与收起都不需要重新计算;代码对比导出 patch 也在同一处,复制与下载给到的是同一份 unified 文本。性能上有四道护栏,都是为了不让浏览器卡死:单侧超过 30 万字符直接拦下;超过 15 万字符自动关掉语法高亮;单行超过 5,000 字符不分词;差异超过 4,000 行时页面只渲染前 4,000 行。前三道只影响显示效果,导出的补丁始终是完整的

导出的统一 diff 补丁怎么读、怎么打回去

导出的是标准 unified diff 格式:两行文件头,后面跟若干个以 @@ 开头的变更块,块里每一行再用空格、减号、加号三种前缀区分上下文行、删除行和新增行。认得这几样,不装任何工具也能照着补丁把改动搬到别处。

统一 diff 补丁里每一行分别是什么
补丁里的这一行它是什么
--- a/code旧版一侧的文件标签
+++ b/code新版一侧的文件标签;两侧刻意同名,git apply 才不会把补丁当成改名而直接报错
@@ -9,6 +9,7 @@变更块头:旧文件从第 9 行起取 6 行,新文件从第 9 行起取 7 行;行号一律是原文真实行号
空格开头的行上下文行,两侧完全相同,只是用来对位置
减号开头的行旧版有、新版没有的行
加号开头的行新版才有的行

上面那个块头不是编的算例:一份 14 行的文件,只把第 12 行改掉、并在它后面插入一行,按默认 3 行上下文导出,块头就正好是 @@ -9,6 +9,7 @@——起始行 9 是「12 减去 3 行上下文」,6 和 7 是这一块在旧、新两侧各占的行数(新侧多出的 1 行就是插进去的那行)。整段新增或整段删除时,空的那一侧按惯例写成 -0,0。

两点容易踩:补丁头里的 a/code、b/code 是固定标签,不是你真实的文件名,想打回项目里先把这两行换成自己的路径;导出的上下文行数跟随页面设置,唯独选「全部展开」时仍按 3 行输出——把整份文件写进补丁反而不好读,也不是补丁的通用写法。