大多数时候,当我尝试检出另一个现有分支时,如果我在当前分支上有一些未提交的更改,Git不允许我.所以我必须首先提交或存储这些更改.
但是,偶尔Git允许我签出另一个分支而不提交或存储这些更改,它会将这些更改带到我签出的分支.
这里的规则是什么?更改是分阶段还是未分阶段是否重要?将更改传递给另一个分支对我没有任何意义,为什么git有时会允许它?也就是说,它在某些情况下有用吗?
维基百科解释了自动重命名检测:
简而言之,给定修订版N中的文件,修订版N-1中的同名文件是其默认祖先.但是,当修订版N-1中没有同名文件时,Git会搜索仅存在于修订版N-1中的文件,并且与新文件非常相似.
重命名检测显然归结为类似的文件检测.这个算法记录在哪里吗?很高兴知道自动检测到哪种变换.
这是关于内部的git.
我一直在阅读伟大的'Pro Git'一书,并学习一下git如何在内部工作(所有关于SHA1,blob,引用,tress,提交等等).顺便说一句,相当聪明的建筑.
因此,为了放入上下文,git将文件的内容引用为SHA1值,因此只需比较哈希值就能知道特定内容是否已更改.但我的问题是git如何检查工作树中的内容是否发生了变化.
天真的方法是认为,每次运行命令git status或类似命令时,它都会搜索工作目录中的所有文件,计算SHA1并将其与最后一次提交的文件进行比较.但对于大型项目来说,这似乎是非常低效的,就像Linux内核一样.
另一个想法可能是检查文件的最后修改日期,但我认为git不存储该信息(当您克隆存储库时,所有文件都有新的时间)
我确信它是以有效的方式进行的(git非常快),有人如何实现这一目标?
PD:只是添加一个关于git索引的有趣链接,特别声明索引保存有关文件时间戳的信息,即使树对象没有.
最近,一组研究人员使用相同的SHA-1哈希生成了两个文件(https://shattered.it/).
由于Git将此哈希用于其内部存储,这种攻击在多大程度上会影响Git?
Git使用什么算法来确定某些文件是否被重命名?
这就是git status几分钟之前产生的:

标有黄色框的信息不正确.实际上没有这种重命名.文件views/file/create.php并views/file/index.php在一组全新的两个文件后半小时被真正删除 - views/logo/create.php并且views/logo/index.php已创建.
这两个文件集看起来(对于Git)非常相似,但事实仍然是 - 这些不同,重命名的文件.这是一组完整的新文件,在删除第一组文件之前约半小时在不同目录中创建.
由于Git提供的信息不正确,我想满足我的好奇心,这就是我要问的原因.