实际上我没有重命名它,我用linux hash.c
删除了rm
,然后用linux hashdic.c
复制了一个名为cp
的哈希表实现的较新版本另一个目录。删除的文件和新文件非常相似,但不一样,因为我在另一个目录中hashdic.c
工作了几个小时。
然后我输入了git rm hash.c
(虽然它已经从文件系统中删除以便从存储库中删除),然后输入git add hashdic.c
。
然后git commit -am "update to hash table"
。而魔术! Git说:
renamed: hash.h -> hashdic.h
但是,福尔摩斯,怎么样? git如何知道我实际上已重命名该文件,如果技术上我刚删除它并在 DIFFERENT 名称下添加了一个新文件?
整个过程:
~/project/hash.c
复制/粘贴到~/other/project/hashdic.c
rm hash.c
cp ~/other/project/hashdic.c ~/project/hashdic.c
git rm hash.c
git commit -am descr
答案 0 :(得分:3)
试试这个:
$ git diff --name-status -M HEAD^ HEAD
你应该看到在两次提交之间,文件被重命名并且具有(比如)95的“相似性指数”:
R095 hash.c hashdic.c
(我根据您的帖子输入此内容 - 一行调用两个文件.h
,其他人称之为.c
,我在这里调用了.c
;无论如何,它不是剪切 - 并且 - 所以可能会有一些小故障 - 我编制了相似性指数值。但输出应该足够相似,无论如何,我指望相似性指数低于100%。显然至少50 %,因为这是默认值。)
这表明在前一次提交和当前提交之间,文件已重命名并稍作修改。
完成后,请尝试:
$ git diff --name-status -M100% HEAD^ HEAD
这一次,您应该会看到hash.c
已删除并添加了hashdic.c
:
D hash.c
A hashdic.c
这表明上一次提交和当前提交之间的更改有 no 重命名,只有已删除的文件和添加的文件。
这是什么?它们都是:它是地板蜡和甜点顶部!
事实是,git会在每次请求时,动态计算提交(或提交和索引或工作目录,或任何此类配对)之间的更改,是否运行显式git diff
,或者运行git status
(或git commit
为您运行)。您可以指定是否允许重命名检测(--no-renames
1 ),如果允许,则指定相似性阈值(-M
)。
您也可以要求复制检测(-C
和--find-copies-harder
)。有多少“树名”要应用于此,因为从计算上讲,将一个提交中的每个文件与另一个文件中的每个文件进行比较会非常昂贵。默认情况下,git限制您重命名检测,这有点容易,因为git仅针对“在开始提交但不在目标中的文件名,与目标提交中但不在开始时的文件名” ”
(在这种情况下,分别是hash.c
和hashdic.c
,除非你删除和/或添加了其他路径。所以git只需要将这两个文件相互区分开来,而不是针对任何其他文件,获取单个相似性索引并将其与-M
设置进行比较。)
1 这些控制旋钮中的大多数仅在git diff
中可用:git status
硬连线重命名检测到“开”和50%。放入重命名检测队列的文件名数由git config
设置diff.renameLimit
控制。其他git命令,例如git blame
,使用用户可设置的控件运行git的内部diff引擎,但并非所有命令都与git diff
中的含义相同。例如,git blame
只查看一个文件,而不是整个目录,因此-C
和-M
完全不同。