git push上图像旁边的百分比是多少?

git push上图像旁边的百分比是多少?,git,github,Git,Github,我一直想知道,当你推一个git时,图像重写旁边的百分比意味着什么 例如: 重写资产/img/30_credits.png(70%) 我一直认为它只是显示了多少图像画布已被重写,虽然我很想知道确切的 抱歉问了个愚蠢的问题:) 谢谢 简短回答:这是Git的相似性指数。有关计算相似度的算法的详细说明,请参阅 更长:这实际上不是git推送(git push);您从git pull中看到了这一点。但是它也不是git pull:它是由git pull运行git merge产生的输出,实际上是打印它的git

我一直想知道,当你推一个git时,图像重写旁边的百分比意味着什么

例如:

重写资产/img/30_credits.png(70%)

我一直认为它只是显示了多少图像画布已被重写,虽然我很想知道确切的

抱歉问了个愚蠢的问题:)
谢谢

简短回答:这是Git的相似性指数。有关计算相似度的算法的详细说明,请参阅

更长:这实际上不是git推送(git push);您从git pull中看到了这一点。但是它也不是
git pull
:它是由
git pull
运行
git merge
产生的输出,实际上是打印它的
git diff--stat

动词路径(百分比)

其中,
动词
重命名
重写
复制
路径
是文件路径名或相同路径名或(用于重命名)新旧路径名的缩写版本,百分比是相似性索引。Git使用这个相似性索引来确定两个具有不同名称的文件,或者两个具有相同名称但内容非常不同的文件,实际上可能是同一个文件,或者毕竟是不同的文件

也就是说,假设commit
ba3c046
中有文件
A1.txt
A2.txt
,commit
50fcdab
中有
A2.txt
B1.txt
(commit中没有任何其他文件)。这两个
A2.txt
文件很可能是“相同”的文件,即使内容有所改变。可能有人签出了commit
ba3c046
并修改了文件,然后根据修改后的结果进行commit
50fcdab

但是
A1.txt
vs
B1.txt
呢?可能有人签出了
ba3c046
,重命名了该文件,对其进行了更改或不进行更改,并进行了提交
50fcdab
。如果他们这样做了,commit
50fcdab
B1.txt
实际上是与commit
ba3c046
A1.txt
相同的文件

Git确定这两个文件是真正相同的文件还是“几乎相同”(重命名并稍微更改)的文件的方法是比较它们的相似性。为此,它计算
A1.txt
B1.txt
之间的相似性指数

现在假设我们比较commit
ba3c046
(及其两个文件)和commit
0f3ac31
,后者有
A2.txt
B1.txt
、和
C1.txt
。每次提交对Git来说都无关紧要;Git将查看
A1.txt
中的内容,并对它们与
0f3ac31
B1.txt
0f3ac31
C1.txt
的相似性进行评分。如果文件足够相似,Git将匹配它。Git将选择与
ba3c046
中的
A1.txt
最相似的
0f3ac31
文件

这个通过文件内容匹配程度来匹配文件的过程是Git如何确定两次提交中哪些文件是“相同”的
Git diff
-ed。我在这个过程中使用的术语是识别文件,我不喜欢这些文件,因为我们没有试图找到100%相同的文件(尽管由于Git的内部存储系统,这样做很有帮助)

默认情况下,两个不同提交中的两个文件会自动标识(称为“同一文件”)如果它们有相同的名称,即使它们的内容有很大差异。也就是说,这两个文件是预先配对的,而不是因为计算出的相似性而配对。在这种情况下,它们的相似性索引将相对较差,Git将称之为“重写”

Git还有一个相异性索引概念,它只需100减去相似性:例如,75%相似的文件有25%不同git diff的标志可用于打破git默认假设的自动配对,即左侧提交中路径为P的文件必须与右侧提交中路径为P的文件相同。不过,运行
git merge
会调用
git diff
,而不设置中断标志

< P>计算相似度是昂贵的,所以它只针对未成对的文件或B-<代码>。未成对的文件最初是没有另一方的,或者是由 -B<代码>分开的。如果使用 -C<代码>或 >查找副本<代码>或<代码> -查找复制更难的选项,Git将考虑一些左撇子/SO。源端文件可能已复制到某些右侧/目标端文件,因此将源端文件与目标端文件配对不会从“源”中删除源文件对于diff两侧包含大量文件的大型存储库,这需要进行大量相似性计算,并且可能需要花费大量时间


1您还可以从
git apply
中获得相似性索引。我认为
git merge
的diffstat输出现在直接内置到
git merge
本身,但对于真正的合并,您可以通过运行
git diff--stat ^1
来重复它

对于快进操作(虽然
git merge
可以实现,但它实际上不是一个合并),您需要指定正确的提交对。就在
git pull
之后,这是
HEAD{1}
HEAD
,所以
git diff--stat HEAD{1}HEAD
会起作用,但由于这些是相对的名称,它们会在一段时间后停止工作。)此外,一些Shell(例如Windows上的PowerShell,Linux上的tcsh和zsh)使我们很难提供他们喜欢的
@{1}
后缀