目前在用 vs 中的 git 来做版本控制,不过有些问题不是很明白,git 的话是有修改标记的,比如 sd edit+文件,就能标记要修改的文件,保存快照或者其他之类的,还好理解一点,因为已经提前对要修改的内容做了标记。
现在用 vs,同步完 repo 之后直接用编辑器编辑项目文件, 保存后在 vs 里能检测到修改的文件,还能对比源文件,检测修改倒好解释,核对 checksum 值就行,但是不太理解它是如何保存源文件的,如果是文件描述符的话, 在保存文件并且关闭编辑器之后,文件偏移量等信息还会在内存中驻留吗?编辑前我没有告诉 vs 我要修改哪个文件,编辑文件时也是把 vs 关闭着的, 修改完成保存后内存也应该 release 了,再打开 vs 或者说 git,他怎么能对比源文件?或者说能够单凭 checksum 值就检测出修改了哪些内容?还是说有后台程序实时监测内存内打开的文件,有 repo 目录下的就保存该文件快照?
1
fds 2017-09-11 10:55:21 +08:00
git 本身保留着所有文件的原始内容呀,不然怎么提交?
|
2
whypool 2017-09-11 10:55:24 +08:00
git 是有个程序在跑,检测不同的,和 vs 没啥关系,vs 也是调用 git 的命令去检查文件的
|
3
clino 2017-09-11 10:56:02 +08:00
可能是我语文不行,看不懂你的问题
举个栗子? |
4
owt5008137 2017-09-11 11:01:54 +08:00 via Android
你点开显示隐藏文件+关闭隐藏后缀。你就知道了
|
5
heimeil 2017-09-11 11:01:57 +08:00 via Android
git 拿最后一次提交内容对比现在的内容,建议再了解一下 git 原理。
|
6
UnknownR OP @heimeil
@clino @fds 并没有提交。举个栗子,我 clone 了个 repo 到本地为 workspace (通过 vistual studio ),然后拿 notepad++修改一个配置文件然后保存,然后打开 vs, 他能自动识别我刚刚改了哪些文件,这个容易解释,对比哈希值就可以,但是他还能对比源文件,问题是我之前并没有给要修改的文件标记,我在编辑器里是 ctrl+s 来保存的,按理说应该是覆盖了,ctrl+z 这种返回操作是没用了,notepad++在打开文件时内存中还有保留的修改信息,但是我已经关闭了,内存应该也释放了,编辑时 vs 也是关闭着的,但是保存后打开,vs/git 仍然知道我编辑了什么内容,他有 compare with unmodified,可以看到文本中修改了哪些内容,我想知道这一步是怎么实现的 |
7
otakustay 2017-09-11 11:40:01 +08:00
看哪些文件修改过是 git status
对比源文件是 git diff 这些全部是基于文件系统来做的,并不是你想象的实时标记,所有的功能 git 都直接提供了,建议可以再深入一些学习下 git 本身 |
8
fds 2017-09-11 11:40:50 +08:00
@UnknownR 跟 VS 无关。你用编辑器改过,git 就知道哪里有修改,是 git 保存的原始文件。用 git diff 看看就知道了
|
9
gl09025 2017-09-11 11:43:07 +08:00
难道不是 git 工作区与暂存区的对比吗?
|
10
clino 2017-09-11 11:44:31 +08:00
@UnknownR 还是不明白你的疑问在哪里,和基准版本做比较不是所有的版本管理工具都能做到的吗?
"compare with unmodified"不是只要有两份文件就能比较了吗? 你是对 git 如何获取基准版本有疑问? |
11
AlphaTr 2017-09-11 11:45:40 +08:00
git 本身记录修改前的源文件的,提供对比修改前后文件差异的方法
|
12
bertonzh 2017-09-11 11:47:52 +08:00
因为实现版本管理的是 GIT,不是 VS
|
13
UnknownR OP @clino git 有文件跟踪和添加到暂存区,可是我在编辑前并没有在 git 上做任何操作,直接就编辑了,打开 vs 后他能直接识别修改的内容,难道 git 一直有后台在实时监测 repo 内文件的状态?
|
15
CEBBCAT 2017-09-11 12:06:15 +08:00 via Android
说白了,它本地存了个备份
|
16
oott123 2017-09-11 12:08:38 +08:00 via Android
在你 clone 伊始,git 就保留了全部文件的副本,存在 .git 目录下。于是它只需要把你改了之后的文件,和它保存的副本对比即可。
|
17
oott123 2017-09-11 12:09:36 +08:00 via Android
你觉得「编辑前没有做任何操作」,可你明明 clone 了一个完整的版本库。这不是「在 git 中做的操作」吗?为什么选择性无视它呢?
|
18
fyl00 2017-09-11 12:10:01 +08:00
楼主的问题是不是在于,为什么工具能知道文件哪些地方变了?
如果是的话,从有 repo 开始,Git 就知道你未修改前的文件内容了,而不仅仅是 MD5 之类的值了。所以 Git 不用实时监控,,因为有了原内容,和修改后的内容,只要调用下命令就能知道做了哪些改变。 |
19
fyl00 2017-09-11 12:10:54 +08:00
Git 不是在记录操作这个动作,而是在记录文件本身内容的变化情况。
|
20
yanhejihe 2017-09-11 12:11:21 +08:00
git 并没有后台,但是 vs 启动时,会调用 git 的指令进行对比,是实时的,可能 vs 对 git 的调用指令有优化,但本质上还是调用 git 的方法。另外,git 在本地存有所有改动的记录
|
21
momocraft 2017-09-11 12:15:17 +08:00
上一个版本在上一个 commit 里 (.git 下面)。程序只需要比较上一 commit 中的 tree 和你的 work tree (你修改的 **结果**),不需要知道你中间做了什么,也不需要监视你的修改 **行为**。
|
22
yanhejihe 2017-09-11 12:29:55 +08:00
修正下,vs 启动时,是用自己文件对比,而不是 git 的。在你没 git add 前,是会有 local history 的(哪个时间点,改了什么,类似快照),我是从 Android studio 推论出的。
|
23
UnknownR OP |
24
LioMore 2017-09-11 13:09:53 +08:00 via iPhone
和 vs 有什么关系?
|
25
xomix 2017-09-11 13:13:32 +08:00
fc 1.txt 2.txt >3.txt
………………我觉得你肯定不是很清楚这是在做啥。 |