解决:Git checkout的文件有diff

By | 3月 7, 2019

问题描述

Linux下使用Git,不管怎么checkout或reset,有些文件总是有diff(标注被modified)。

问题原因

checkout文件时,git把windows的换行符(CRLF)转换成Linux的换行符(LF),由此产生diff。

解决办法

修改.git/config文件

[core]
        autocrlf = input
        safecrlf = warn
        eol = lf

autocrlf:默认true

  • true:会自动在commit/checkout时,将CRLF转换为LF。
  • false:不做任何转换。
  • input:仅在commit时有转换,checkout时不转换。

safecrlf:默认true

  • true:不允许提交混合换行符的文件。
  • false:允许提交混合换行符的文件。
  • warn:显示warning,并允许提交。

eol:默认native。autocrlf为false时,才起作用。表示commit文件时,用什么换行符。

  • native:操作系统的换行符。
  • crlf:使用Windows CRLF。
  • lf:使用Linux LF

P.S. 因为autocrlf不是false,“eol = lf”其实没起作用。这里只是以防autocrlf为true时,依然使用Linux LF作为换行符。

强制刷新所有文件

git rm –cached -r .
git reset –hard

设置正确莫名还是出现该问题

我设置autocrlf = input,但是还是出现这种diff。此时就git reset –hard [origin/master]一下把。

扩展:CRLF、CR、LF解释

原文地址:https://www.jianshu.com/p/b03ad01acd69

  • CR:Carriage Return,对应ASCII中转义字符\r,表示回车
  • LF:Linefeed,对应ASCII中转义字符\n,表示换行
  • CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行

Windows操作系统采用两个字符来进行换行,即CRLF;Unix/Linux/Mac OS X操作系统采用单个字符LF来进行换行;另外,MacIntosh操作系统(即早期的Mac操作系统)采用单个字符CR来进行换行。