背景

关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。

后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“ <回车><换行>”,即“\r\n”;Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

Windows创建的文件是 \n\r结束的, 而Linux等类Unix操作系统是\n结束的。所以Unix的文本到Windows会出现换行丢失(ultraedit这类软件可以正确识别); 而反过来就会出现^M的符号了

Windows等操作系统用的文本换行符和Unix/Linux操作系统用的不同,Windows系统下输入的换行符在Unix/Linux下不会显示为“换行”,而是显示为 ^M 这个符号(这是Linux等系统下规定的特殊标记,占一个字符大小,不是 ^ 和 M 的组合,打印不出来的)。Linux下很多文本编辑器(命令行)会在显示这个标记之后,补上一个自己的换行符,以避免内容混乱(只是用于显示,补充的换行符不会写入文件,有专门的命令将Windows换行符替换为Linux换行符)。 Unix/Linux系统下的换行符在Windows系统的文本编辑器中会被忽略,整个文本会乱成一团。

Git 换行符自动转换

Git 的“换行符自动转换”功能听起来似乎很智能、很贴心,因为它试图一方面保持仓库内文件的一致性(UNIX 风格),一方面又保证本地文件的兼容性(Windows 风格)。但遗憾的是,这个功能是有 bug 的,而且在短期内都不太可能会修正。

问题具体表现在,如果你手头的这个文件是一个包含中文字符的 UTF-8 文件,那么这个“换行符自动转换”功能 在提交时是不工作的(但签出时的转换处理没有问题)。我猜测可能这个功能模块在处理中文字符 + CRLF 这对组合时直接崩溃返回了。

例子: 你在 Windows 下用默认状态的 Git 签出一个文件,写了一行中文注释(或者这个文件本来就包含中文),然后存盘提交……不经意间,你的文件就被毁掉了。 因为你提交到仓库的文件已经完全变成了 Windows 风格(签出时把 UNIX 风格转成了 Windows 风格但提交时并没有转换),每一行都有修改(参见本文开头的示意图),而这个修改又不可见(大多数 diff 工具很难清楚地显示出换行符),这最终导致谁也看不出你这次提交到底修改了什么。 这还没完。如果其他小伙伴发现了这个问题、又好心地把换行符改了回来,然后你又再次重演上面的悲剧,那么这个文件的编辑历史基本上就成为一个谜团了。 由于老外几乎不可能踩到这个坑,使得这个 bug 一直隐秘地存在着。

Git 换行符配置建议

多平台,多 IDE,团队协作,跨平台开发,这是大多数项目都会面临的问题,所以防患于未然,要在项目之初就统一好换行符(项目中技术管理是一门艺术啊!)。

团队需要确定一个统一的换行符标准(推荐使用 UNIX 风格,因为 Git 就是使用 UNIX 换行符)

前期准备工作:配置好使用的代码编辑器与 IDE 达到两项标准:

  1. 在新建文件时默认使用团队统一的换行符标准
  2. 在打开文件时保持现有换行符格式不变(不要做自动转换)

关闭 Git 换行符自动转换

关闭之后,Git 就不会对你的换行符做任何手脚了,你可以完全自主地、可预期地控制自己的换行符风格。

下面主要针对不同的 Git 客户端,分别介绍一下操作方法。

Git for Windows

由 Git 官方出品,在安装时就会向你兜售“换行符自动转换”功能,估计大多数人在看完华丽丽的功能介绍之后会毫不犹豫地选择第一项(自动转换)。请千万抵挡住诱惑,选择最后一项(不作任何手脚)。

如果你已经做出了错误的选择,也不需要重新安装,可以直接使用命令行来修改设置。很简单,直接打开这货自带的命令行工具 Git Bash,输入以下命令,再敲回车即可: git config --global core.autocrlf false

TortoiseGit

TortoiseGit 作为主力客户端,实际上是基于 Git for Windows 的一个 GUI 外壳,你在 Git for Windows 所做的设置会影响 TortoiseGit 的配置。

若未安装 Git for Windows,可在 Windows 资源管理器窗口中点击右键,选择“TortoiseGit → Settings → Git”,进行设置。

GitHub 的 Windows 客户端

GitHub 的 Windows 客户端实际上也是一个壳,它自带了一个便携版的 Git for Windows。这个便携版和你自己安装的 Git for Windows 是相互独立的,不过它们都会使用同一个配置文件(实际上就是当前用户主目录下的 .gitconfig 文件)。

所以如果你已经配置好了自己安装的 Git for Windows,那就不用操心什么了。但如果你的机器上只装过 GitHub 的 Windows 客户端,那么最简单的配置方法就是手工修改配置文件了。

修改 Git 的全局配置文件

进入当前用户的主目录,修改 .gitconfig 文件

[core] 区段找到 autocrlf,将它的值改为 false。如果没找到,就在 [core] 区段中新增一行: autocrlf = false

事实上上面介绍的所有命令行或图形界面的配置方法,最终效果都是一样的,因为本质上都是在修改这个配置文件。

关闭了换行符自动转换,担心文件中带入了 Windows 的回车换行符,Git 为防止这种你的失误,提供了换行符检查功能(core.safecrlf),可以在提交时检查文件是否混用了不同风格的换行符。这个功能的选项如下:

  • false - 不做任何检查
  • warn - 在提交时检查并警告
  • true - 在提交时检查,如果发现混用则拒绝提交

我建议使用最严格的 true 选项。

core.autocrlf 一样,你可以通过命令行、图形界面、配置文件三种方法来修改这个选项。具体操作就不赘述了,大家自己举一反三吧。

Eclipse 的换行符配置

切换换行符的显示格式

改为 Unix 风格的换行符

Eclipse 自带 Git 工具关闭换行符自动转换

GIT 换行符相关操作相关推荐

  1. git换行符之autoCRLF配置的意义

    关于git换行符处理的问题,我查了一查,自己的设置中,global-config中设了autocrlf=false,systemwide中将autocrlf设成了true. 关于配置的作用域,syst ...

  2. git 换行符LF与CRLF转换问题

    git 换行符LF与CRLF转换问题 一.背景 在各操作系统下,文本文件所使用的换行符是不一样的.UNIX/Linux 使用的是 0x0A(LF),早期的 Mac OS 使用的是0x0D(CR),后来 ...

  3. 解决不同操作系统下git换行符一致性问题

    解决不同操作系统下git换行符一致性问题 参考文章: (1)解决不同操作系统下git换行符一致性问题 (2)https://www.cnblogs.com/warking/p/5718648.html ...

  4. notepad++替换回车换行符,如何操作?

    notepad++替换回车换行符,如何操作? 下面以,替换为换行符,举例说明 二个关键点: 1.替换为中输入\r\n 2.查找模式中选"扩展(x)(\n,\r...)" 如下图所示 ...

  5. git 换行符问题,统一linux风格

    在多平台开发,换行符一直很纠结的问题. 风来了.fox 统一设置 成linux风格 CR回车 LF换行Windows/Dos CRLF \r\n Linux/Unix LF \n MacOS CR \ ...

  6. git 换行符LF与CRLF转换问题 IDE的默认换行符设置为LF

    在各操作系统下,文本文件所使用的换行符是不一样的.UNIX/Linux 使用的是 0x0A(LF),早期的 Mac OS 使用的是0x0D(CR),后来的 OS X 在更换内核后与 UNIX 保持一致 ...

  7. git合并分支相关操作

    在开发过程中偶尔会遇到bug需要紧急修复,这时我们一般会新建一个单独分支专门用来修复bug,目的是不影响已有开发进度,这就涉及到新建分支.合并分支.打tag等操作,今天在这里给大家做一个简单分享- 1 ...

  8. Git 修改commit 相关操作

    修改最新提交的commit的message git commit --amend 执行 git commit --amend 然后修改注释即可 (需要通过vi 或vim编辑并保存) 修改旧的commi ...

  9. git撤销的相关操作

    在公司开发中, 大多会采用git做代码管理, 今天主要记录一下git在各个阶段去撤销之前提交的相关代码. add 将自己开发的代码提交到暂存区, 会采用git add . 的命令行形式, 但是提交后如 ...

最新文章

  1. 孙立岩 python-basic: 用于学习python基础的课件(一二三四)
  2. 【零基础学习iOS开发】【02-C语言】08-基本运算
  3. Machine Learning on Spark——第四节 统计基础(二)
  4. 【转】Matlab axis用法
  5. html判断是否有某个元素,jquery怎么判断元素是否存在?
  6. 团队-象棋游戏-需求分析
  7. Android之mediarecorder中的方法以及工作流程的过程
  8. (13)FPGA设计思想
  9. 数据库(第一范式,第二范式,第三范式)
  10. Linux下防火墙开启相关端口及查看已开启端口
  11. android webview 选择图片上传,Android webview打开本地图片上传实现代码
  12. 企业微服务架构转型-关键诉求
  13. 汽车DTC故障码格式解析
  14. 如何在Mac电脑上更改地区或国家?
  15. 46-Java-RabbitMQ
  16. java epics_Visual Paradigm敏捷开发教程(7):如何管理Epics
  17. [JavaScript学习记录] 首次运用于网页,做一个简易利息计算器!!!
  18. ireport的简单使用(数据表格)报表
  19. win8.1环境下硬盘安装centos6.5双系统
  20. html下拉复选框联动,HTML : CheckBox 复选框成组联动(JavaScript)

热门文章

  1. 压缩工具gzip,bzip2,xz,zip,tar
  2. Mac os 安装 MySQL和MySQL-Python
  3. pxeconfig 4.2.0 发布,PXE 首要启动设备
  4. 【JQuery】可直接编辑的表格
  5. 总线控制内部eep_【上周回顾】小白如何自学单片机;电子专业的十个神总结;摩尔定律54年;电子工程师常弄混的总线分类汇总;他做成了半导体害怕他做的事...
  6. windows 检查cuda安装_Windows环境CUDA 4.0:安装与验证
  7. 6s如何无线连电脑连接服务器,iPhone 6s无线连接能力:WiFi与4G大提速
  8. java最长同值路径_687.最长同路径值
  9. 如何在 Centos8 中安装 Lynis审计工具
  10. 学习一个 Linux 命令:sort 命令