让人抓狂的换行符LF和CRLF
前言
使用过git的小伙伴都知道,提交版本前会使用git diff来对比一下当前的修改,确认无误后再commit。
然而,有时候会碰上这种情况(Pycharm里的文件对比):
![](https://raw.githubusercontent.com/wbbeyourself/tuchuang/master/img/annoy-diff.png)
红框里的意思:内容上仅仅是换行符的差异。
左边是上一版本,右边是当前版本(工作区的版本)。
左边的换行符是 LF,右边换行符是 CRLF。
下面依次几个问题:
- LF和CRLF是什么?
- 为什么代码里会出现这种diff?
- 如何处理这种换行符差异?
问题一:LF和CRLF是什么?
-
LF
:"\n",Linux的换行符; -
CRLF
:"\r\n",Windows的换行符。
问题二:为什么代码里会出现这种diff?
-
情况一:代码开发者在Linux和Windows上都编辑过代码且来回传输过;
-
情况二:在多人协作开始时也会出现这种情况,比如猿A喜欢在Linux上写代码,并提交。这个时候代码版本里保存的就是
LF
换行符。而猿B在Windows上开发,他的代码里换行符就是CRLF
。于是猿B代码一对比,就出现了本文开头的现象。 -
情况三:git的
core.autocrlf
这个配置是True,即git pull时自动将远程代码里的换行符(比如LF)转换成当前系统的换行符(比如CRLF)。
问题三:如何处理这种换行符差异?
- 方法一:如果确认代码内容没什么差异,只是单纯的换行符差异的话,最简单的办法就是直接丢弃当前的改动,可以使用pycharm里的revert按钮即可,点击确认:
![](https://raw.githubusercontent.com/wbbeyourself/tuchuang/master/img/revert.png)
方法二:Windows系统解决办法:修改 git 全局配置,禁止 git 自动将 lf 转换成 crlf, 命令
git config --global core.autocrlf false
再次查看:
git config --global -l
结果如下:core.autocrlf=false