V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
UnknownR
V2EX  ›  git

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

  •  
  •   UnknownR · 2017-09-11 10:47:43 +08:00 · 5679 次点击
    这是一个创建于 2629 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2017-09-11 12:27:14 +08:00
    十分感谢各位的回复和解答!因为之前在.git 目录中看一些 temp 文件,要么是只有 1kb 的散列值,要么是在根目录下几百 kb 的 index,但是整个有 400 多 mb,所以也没觉得那个 index 能装下所有的内容,经 v 友提醒已经看了几篇原理的博客后,才在.git>objects>pack 目录下发现了 500+mb 的 pack 文件和其对应的 index 文件,没想到 git 真的是差不多又复制了一个 repo,等于 clone 一个 repo,git 又给你 copy 了一份副本
    28 条回复    2017-09-11 18:10:12 +08:00
    fds
        1
    fds  
       2017-09-11 10:55:21 +08:00
    git 本身保留着所有文件的原始内容呀,不然怎么提交?
    whypool
        2
    whypool  
       2017-09-11 10:55:24 +08:00
    git 是有个程序在跑,检测不同的,和 vs 没啥关系,vs 也是调用 git 的命令去检查文件的
    clino
        3
    clino  
       2017-09-11 10:56:02 +08:00
    可能是我语文不行,看不懂你的问题
    举个栗子?
    owt5008137
        4
    owt5008137  
       2017-09-11 11:01:54 +08:00 via Android
    你点开显示隐藏文件+关闭隐藏后缀。你就知道了
    heimeil
        5
    heimeil  
       2017-09-11 11:01:57 +08:00 via Android
    git 拿最后一次提交内容对比现在的内容,建议再了解一下 git 原理。
    UnknownR
        6
    UnknownR  
    OP
       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
        7
    otakustay  
       2017-09-11 11:40:01 +08:00
    看哪些文件修改过是 git status
    对比源文件是 git diff
    这些全部是基于文件系统来做的,并不是你想象的实时标记,所有的功能 git 都直接提供了,建议可以再深入一些学习下 git 本身
    fds
        8
    fds  
       2017-09-11 11:40:50 +08:00
    @UnknownR 跟 VS 无关。你用编辑器改过,git 就知道哪里有修改,是 git 保存的原始文件。用 git diff 看看就知道了
    gl09025
        9
    gl09025  
       2017-09-11 11:43:07 +08:00
    难道不是 git 工作区与暂存区的对比吗?
    clino
        10
    clino  
       2017-09-11 11:44:31 +08:00
    @UnknownR 还是不明白你的疑问在哪里,和基准版本做比较不是所有的版本管理工具都能做到的吗?
    "compare with unmodified"不是只要有两份文件就能比较了吗? 你是对 git 如何获取基准版本有疑问?
    AlphaTr
        11
    AlphaTr  
       2017-09-11 11:45:40 +08:00
    git 本身记录修改前的源文件的,提供对比修改前后文件差异的方法
    bertonzh
        12
    bertonzh  
       2017-09-11 11:47:52 +08:00
    因为实现版本管理的是 GIT,不是 VS
    UnknownR
        13
    UnknownR  
    OP
       2017-09-11 12:02:24 +08:00 via iPhone
    @clino git 有文件跟踪和添加到暂存区,可是我在编辑前并没有在 git 上做任何操作,直接就编辑了,打开 vs 后他能直接识别修改的内容,难道 git 一直有后台在实时监测 repo 内文件的状态?
    also24
        14
    also24  
       2017-09-11 12:04:22 +08:00
    @UnknownR #13 打开 ".git" 文件夹看看,有惊喜
    CEBBCAT
        15
    CEBBCAT  
       2017-09-11 12:06:15 +08:00 via Android
    说白了,它本地存了个备份
    oott123
        16
    oott123  
       2017-09-11 12:08:38 +08:00 via Android
    在你 clone 伊始,git 就保留了全部文件的副本,存在 .git 目录下。于是它只需要把你改了之后的文件,和它保存的副本对比即可。
    oott123
        17
    oott123  
       2017-09-11 12:09:36 +08:00 via Android
    你觉得「编辑前没有做任何操作」,可你明明 clone 了一个完整的版本库。这不是「在 git 中做的操作」吗?为什么选择性无视它呢?
    fyl00
        18
    fyl00  
       2017-09-11 12:10:01 +08:00
    楼主的问题是不是在于,为什么工具能知道文件哪些地方变了?


    如果是的话,从有 repo 开始,Git 就知道你未修改前的文件内容了,而不仅仅是 MD5 之类的值了。所以 Git 不用实时监控,,因为有了原内容,和修改后的内容,只要调用下命令就能知道做了哪些改变。
    fyl00
        19
    fyl00  
       2017-09-11 12:10:54 +08:00
    Git 不是在记录操作这个动作,而是在记录文件本身内容的变化情况。
    yanhejihe
        20
    yanhejihe  
       2017-09-11 12:11:21 +08:00
    git 并没有后台,但是 vs 启动时,会调用 git 的指令进行对比,是实时的,可能 vs 对 git 的调用指令有优化,但本质上还是调用 git 的方法。另外,git 在本地存有所有改动的记录
    momocraft
        21
    momocraft  
       2017-09-11 12:15:17 +08:00
    上一个版本在上一个 commit 里 (.git 下面)。程序只需要比较上一 commit 中的 tree 和你的 work tree (你修改的 **结果**),不需要知道你中间做了什么,也不需要监视你的修改 **行为**。
    yanhejihe
        22
    yanhejihe  
       2017-09-11 12:29:55 +08:00
    修正下,vs 启动时,是用自己文件对比,而不是 git 的。在你没 git add 前,是会有 local history 的(哪个时间点,改了什么,类似快照),我是从 Android studio 推论出的。
    UnknownR
        23
    UnknownR  
    OP
       2017-09-11 12:30:16 +08:00
    @fyl00
    @yanhejihe
    @momocraft
    @CEBBCAT
    @oott123
    @also24
    @clino
    @AlphaTr
    十分感谢各位的回复,查看目录后发现,确实 git 又相当于复制了一份用于检测对比的 repo 在.git 的暂存区中
    LioMore
        24
    LioMore  
       2017-09-11 13:09:53 +08:00 via iPhone
    和 vs 有什么关系?
    xomix
        25
    xomix  
       2017-09-11 13:13:32 +08:00
    fc 1.txt 2.txt >3.txt
    ………………我觉得你肯定不是很清楚这是在做啥。
    UnknownR
        26
    UnknownR  
    OP
       2017-09-11 14:02:20 +08:00
    @xomix 我一般用 windiff
    xomix
        27
    xomix  
       2017-09-11 14:26:31 +08:00
    @UnknownR 外部命令需要另外加载,fc 是内部命令。
    heimeil
        28
    heimeil  
       2017-09-11 18:10:12 +08:00
    @UnknownR #23 并不是复制了一份 repo 在.git 中用于检测对比,而是.git 存储了所有历史记录,检测是否改变就是拿历史里的最后一个版本和没有提交的版本做对比而已,检测改变只是对版本控制工具的一个扩展应用。

    你 clone 了别人的 repo 不是单单下载了最新的代码,最主要的.git 文件夹,别人的所作所为全都在里面,可以随意查看这个 repo 从无到有的所有历史修改,这就是版本控制的核心。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5234 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:58 · PVG 13:58 · LAX 21:58 · JFK 00:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.