原文链接:文本换行符号 (^M) 导致的 git diff 问题 | 👨🏻🌾 苏子叶的技术菜园
问题的现象
文件改动了一点,但是在 gitlab/github 看 diff 却发现整个文件全部都进行了改动,且文件变的乱序或者变成了一行。
原因: 文件换行符导致
文本换行符号通常有: LF 和 CRLF。
首先介绍 LF 和 CRLF 下是什么:
- CRLF: 是 carriagereturnlinefeed 的缩写。中文意思是回车换行;
- LF: 是 line feed 的缩写,中文意思是换行;
- CR: 是 carriagereturn 的缩写。中文意思是回车;
为什么换行回车会不同呢? 主要的原因在于操作系统之间的分歧:
- 早期的 macOS 系统使用 CR 当做换行,现在也已经统一成了 LF。
- Unix(包含现在大量使用的 linux) 系统使用 LF
- Windows 系统使用 LFCR 当做换行
也正是因为不同系统的分歧,在多人协作共同开发的时候,可能导致提交代码时候产生问题。
解法
1. IDE 或者代码编辑器中统一将换行符修改为: LF
2. 在 git 中进行配置
git 为了防止以上问题扰乱跨平台合作开发,使用命令可以转化 LF 和 CRLF
具体命令为:
-
git config --global core.autocrlf true
: Git 可以在你 push 时自动地把行结束符 CRLF 转换成 LF,而在 pull 代码时把 LF 转换成 CRLF。用 core.autocrlf 来打开此项功能,如果是在 Windows 系统上,把它设置成 true,这样当签出代码时,LF 会被转换成 CRLF -
git config --global core.autocrlf input
: Linux 或 Mac 系统使用 LF 作为行结束符;当一个以 CRLF 为行结束符的文件不小心被引入时你肯定想进行修正,把 core.autocrlf 设置成 input 来告诉 Git 在 push 时把 CRLF 转换成 LF,pull 时不转换 -
git config --global core.autocrlf false
: 在本地和代码库中都保留 CRLF,无论 pull 还是 push 都不变,代码库什么样,本地还是什么样子
参考链接: