合并时忽略空白差异
跨平台协作时行尾(CRLF 与 LF)和缩进方式的差异会制造大量伪冲突。-X ignore-space-change 在合并判断时忽略空白数量的变化,-X ignore-all-space 连空白的增删都不比较,让合并聚焦真正的逻辑改动。
基本信息
| 语法 | git merge -X ignore-space-change <分支> |
|---|---|
| 更强变体 | -X ignore-all-space,完全不比较空白 |
| 作用范围 | 仅影响合并冲突判断,不改变文件内容 |
| 根治手段 | .gitattributes 统一 text 与 eol 属性 |
典型使用场景
- Windows 与 Linux 开发者混合协作的仓库
- 仓库刚引入格式化工具,历史文件空白差异巨大
- 合并第三方代码,风格与本地规范不一致
- 只想并入逻辑改动,不想被空白噪音淹没
- 需要把格式化提交与逻辑提交分开处理
常用示例
常用示例
git merge -X ignore-space-change feature/format # 忽略空白数量变化
git merge -X ignore-all-space feature/indent # 完全不比较空白
git diff --ignore-all-space --stat # 核对实际改动范围
# 根治方式:仓库根目录放 .gitattributes 统一行尾
printf '*.text eol=lf\n*.sh text eol=lf\n' > .gitattributes
git add .gitattributes && git commit -m 'chore: 统一行尾为 LF'空白选项对照
| 选项 | 比较方式 | 适用场景 |
|---|---|---|
| -X ignore-space-change | 忽略空白数量变化 | 行尾或缩进数量不同 |
| -X ignore-all-space | 忽略全部空白差异 | 两侧缩进改动都很大 |
| --ignore-all-space | 仅影响 diff 展示 | 审阅时过滤掉空白噪音 |
忽略空白只改变冲突判断,不改变合并结果的内容:合并后仍要跑一遍格式化与测试,别让空白策略掩盖真实的逻辑冲突。
判断该不该忽略空白,可以先跑 git diff --ignore-all-space --stat:如果实际改动很小而普通 diff 很大,说明差异主要来自空白,此时忽略空白合并才是正确做法。
合并选项只在本次命令生效,适合一次性的救火;如果同一仓库反复出现空白冲突,应把行尾规则写进 .gitattributes 并统一编辑器设置,让问题在源头消失。
忽略空白的合并结果仍需人工确认:工具只负责跳过噪音,最终格式以仓库统一的格式化工具输出为准,合并后重跑一次格式化并提交,可避免风格在两套规则之间来回摆动。