2412git,gitdiff与编码
原文
除了git
命令行工具外,还有其他工具或服务
可让你查看git
历史记录中的更改
.最有趣的是
那些按拉请的一部分更改
的情况,因为这些是你正在审查和批准
的更改.
但一个常见的问题
是,它们给你展示
的可能不是实际改变的内容
.
我把讨论限制
在我有经验的服务和工具
上,即它是git
命令行,AzureDevOps
,GitHub
和VS
.欢迎你共享你使用的其他服务的细节
,尤其是用来审查代码
的服务.
首先,考虑一个更改文件编码
的提交.即,假设文件
如下:
I just checked.
It costs A31.
其中A3
表示0xA3
十六进制值的单个字节
.这在Windows1252
代码页中,是£
的表示.
假设你按UTF-8
更改此文件的编码
:
It costs C2A31.
如果在命令行
中用git show
查看它,你会得到:
I just checked.
- It costs <A3>1.
+ It costs £1.
命令行版本
显示以前有个0xA3
字节但现在有一个£符
.
接着是GitHub
.它的差异
说
I just checked.
- It costs 1.
- It costs £1.
GitHub
假设所有文件
都是UTF-8
的,因此它按非法的UTF-8
代码单元序列
解释A3
,并使用U+FFFD
替换符表示.
接着
是TeamFoundationServices,VisualStudioOnline,VisualStudioTeamServices,AzureDevOps.AzureDevOps
.就是该名字.AzureDevOps
.
下面是AzureDevOps
显示的内容:
The file differs only in whitespace.
如果你展开文件
并允许(显示空白更改
),它不会显示更改
,甚至不会显示空格更改
!
I just checked.
It costs £1.
这非常令人担忧
,因为即,如果你更改了文件的文本
,且还更改了编码
,AzureDevOps
会高亮更改文本
,但不会告诉你,已更改编码
!
如,也许有人更改了第一行文本
,并意外地按UTF-8
从1252
更改编码.AzureDevOps
显示它为
I just checked.
I just looked.
It costs £1.
它愉快
地给你展示更改文本
,但完全忽略了编码更改
.
该编码更改
可能会导致你无意
中更改了资源脚本
中的一组串
这里,从而导致错编码
.
如果要求VS
查看差异,它表示已修改(M
)文件,但是当你要求查看差异
时,它会显示"0更改"
,且不会高亮内容
.
现在考虑在文件开头
插入UTF-8
的BOM
的提交.
在使用git
的命令行中,可得到如下:
- I just checked.
+ I just checked.
按一个空格
显示BOM
.不是很好
,但至少有一个+/-
来告诉你有什么变化
,如果第一行不是空白的
,则移动的内容
告诉你在文件开头
插入了些东西.
对GitHub
,差异
如下:
- I just checked.
- I just checked.
高亮
告诉你该行
有了一些变化
,但是你看不到变化
.更改
必然是不可见的
,但至少告诉你了,该行有更改
;只是你看不到它.
最后,AzureDevOps
:
The file differs only in whitespace.
如前,即使你展开文件
并允许"显示空白更改
",你也看不见更改
.
I just checked.
It costs £1.
因此,AzureDevOps
会告诉你文件有空格
更改,但你查看它
时,不会显示更改
.
如果要求VS
查看差异,它会再次指示已修改(M
)文件,但是当你要求查看差异
时,它会显示"0更改"
,且不会高亮内容
.
我怀疑,在GitHub,AzureDevOps
或VS
没有显示可见更改时,大多数用户
只会认为,“一定是个错误”,而没有发现,实际上,那里有你看不到的变化
.
因此,按一个表格
总结这些结果
.
= | git 命令行 | GitHub | AzureDevOps | VS |
---|---|---|---|---|
代码页 | UTF-8 格式 | UTF-8 格式 | 猜 | 猜 |
更改编码 | 在差异 显示 | 在差异 显示 | 不显示更改 | 不显示更改 |
更改BOM | 按空格显示 | 不可见 | 同上 | 同上 |
结论,如果使用这些系统
中的一个工作,在处理包含7位美标
集外的符时需要密切注意
,因为很难
发现编码或BOM
的变化,甚至完全不可见
.
即使它极大
地改变了文件内容
.