Visual Studio 中的 Git 系统是如何进行文件对比的?

2017-09-11 10:47:43 +08:00
 UnknownR

目前在用 vs 中的 git 来做版本控制,不过有些问题不是很明白,git 的话是有修改标记的,比如 sd edit+文件,就能标记要修改的文件,保存快照或者其他之类的,还好理解一点,因为已经提前对要修改的内容做了标记。

现在用 vs,同步完 repo 之后直接用编辑器编辑项目文件, 保存后在 vs 里能检测到修改的文件,还能对比源文件,检测修改倒好解释,核对 checksum 值就行,但是不太理解它是如何保存源文件的,如果是文件描述符的话, 在保存文件并且关闭编辑器之后,文件偏移量等信息还会在内存中驻留吗?编辑前我没有告诉 vs 我要修改哪个文件,编辑文件时也是把 vs 关闭着的, 修改完成保存后内存也应该 release 了,再打开 vs 或者说 git,他怎么能对比源文件?或者说能够单凭 checksum 值就检测出修改了哪些内容?还是说有后台程序实时监测内存内打开的文件,有 repo 目录下的就保存该文件快照?

5572 次点击
所在节点    git
28 条回复
fds
2017-09-11 10:55:21 +08:00
git 本身保留着所有文件的原始内容呀,不然怎么提交?
whypool
2017-09-11 10:55:24 +08:00
git 是有个程序在跑,检测不同的,和 vs 没啥关系,vs 也是调用 git 的命令去检查文件的
clino
2017-09-11 10:56:02 +08:00
可能是我语文不行,看不懂你的问题
举个栗子?
owt5008137
2017-09-11 11:01:54 +08:00
你点开显示隐藏文件+关闭隐藏后缀。你就知道了
heimeil
2017-09-11 11:01:57 +08:00
git 拿最后一次提交内容对比现在的内容,建议再了解一下 git 原理。
UnknownR
2017-09-11 11:36:12 +08:00
@heimeil
@clino
@fds
并没有提交。举个栗子,我 clone 了个 repo 到本地为 workspace (通过 vistual studio ),然后拿 notepad++修改一个配置文件然后保存,然后打开 vs, 他能自动识别我刚刚改了哪些文件,这个容易解释,对比哈希值就可以,但是他还能对比源文件,问题是我之前并没有给要修改的文件标记,我在编辑器里是 ctrl+s 来保存的,按理说应该是覆盖了,ctrl+z 这种返回操作是没用了,notepad++在打开文件时内存中还有保留的修改信息,但是我已经关闭了,内存应该也释放了,编辑时 vs 也是关闭着的,但是保存后打开,vs/git 仍然知道我编辑了什么内容,他有 compare with unmodified,可以看到文本中修改了哪些内容,我想知道这一步是怎么实现的
otakustay
2017-09-11 11:40:01 +08:00
看哪些文件修改过是 git status
对比源文件是 git diff
这些全部是基于文件系统来做的,并不是你想象的实时标记,所有的功能 git 都直接提供了,建议可以再深入一些学习下 git 本身
fds
2017-09-11 11:40:50 +08:00
@UnknownR 跟 VS 无关。你用编辑器改过,git 就知道哪里有修改,是 git 保存的原始文件。用 git diff 看看就知道了
gl09025
2017-09-11 11:43:07 +08:00
难道不是 git 工作区与暂存区的对比吗?
clino
2017-09-11 11:44:31 +08:00
@UnknownR 还是不明白你的疑问在哪里,和基准版本做比较不是所有的版本管理工具都能做到的吗?
"compare with unmodified"不是只要有两份文件就能比较了吗? 你是对 git 如何获取基准版本有疑问?
AlphaTr
2017-09-11 11:45:40 +08:00
git 本身记录修改前的源文件的,提供对比修改前后文件差异的方法
bertonzh
2017-09-11 11:47:52 +08:00
因为实现版本管理的是 GIT,不是 VS
UnknownR
2017-09-11 12:02:24 +08:00
@clino git 有文件跟踪和添加到暂存区,可是我在编辑前并没有在 git 上做任何操作,直接就编辑了,打开 vs 后他能直接识别修改的内容,难道 git 一直有后台在实时监测 repo 内文件的状态?
also24
2017-09-11 12:04:22 +08:00
@UnknownR #13 打开 ".git" 文件夹看看,有惊喜
CEBBCAT
2017-09-11 12:06:15 +08:00
说白了,它本地存了个备份
oott123
2017-09-11 12:08:38 +08:00
在你 clone 伊始,git 就保留了全部文件的副本,存在 .git 目录下。于是它只需要把你改了之后的文件,和它保存的副本对比即可。
oott123
2017-09-11 12:09:36 +08:00
你觉得「编辑前没有做任何操作」,可你明明 clone 了一个完整的版本库。这不是「在 git 中做的操作」吗?为什么选择性无视它呢?
fyl00
2017-09-11 12:10:01 +08:00
楼主的问题是不是在于,为什么工具能知道文件哪些地方变了?


如果是的话,从有 repo 开始,Git 就知道你未修改前的文件内容了,而不仅仅是 MD5 之类的值了。所以 Git 不用实时监控,,因为有了原内容,和修改后的内容,只要调用下命令就能知道做了哪些改变。
fyl00
2017-09-11 12:10:54 +08:00
Git 不是在记录操作这个动作,而是在记录文件本身内容的变化情况。
yanhejihe
2017-09-11 12:11:21 +08:00
git 并没有后台,但是 vs 启动时,会调用 git 的指令进行对比,是实时的,可能 vs 对 git 的调用指令有优化,但本质上还是调用 git 的方法。另外,git 在本地存有所有改动的记录

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/389679

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX