我在git之外重命名了一些文件并对它们进行了大量修改。 当我运行git diff-index -M --name-status HEAD
时,我只看到4个文件被重命名/移动,而实际上应该更多。
我知道可以使用hg mv --after
在Mercurial中事后记录移动。 我找不到在git中的等价物。 有吗?
我在git之外重命名了一些文件并对它们进行了大量修改。 当我运行git diff-index -M --name-status HEAD
时,我只看到4个文件被重命名/移动,而实际上应该更多。
我知道可以使用hg mv --after
在Mercurial中事后记录移动。 我找不到在git中的等价物。 有吗?
foo
与提交Cn(其中n≠ 0)中的文件foo
完全无关...除非您(或Git)事后决定它们应该相关。(见下面的附注。)
git diff
命令根据文件名相同和/或足够相似来判断两个不同提交中的两个文件是否相关。否则它们是无关的。它会根据您传递给 git diff
的选项,在运行 git diff
时即时决定这一点。因此,如果使用不同的选项运行两次 git diff
,将得到不同的答案。文件 f1
和 f2
可能相关(重命名或复制)或相关(f1
删除,f2
创建)。f1
与提交Cn中的f2
在内容上相同,则该内容仅存储一次,作为以其哈希命名的对象(即使n = 0!)。9999999
和内部树形对象 1234567
以及提交 abcdef2
中的文件 blah
进行增量压缩,我可以得到好的结果,所以我就这么做了!”
摘要:不用担心,只需正常提交文件即可,因为这是你唯一的选择。
以下是Git如何将重命名从X到Y视为一个过程。
Commit #1:
- File named "X" with contents "Hello, world!"
Commit #2:
- File named "Y" with contents "Hello, world!"
git add
和git commit
命令就可以了,此处不需要执行其他操作。如果你使用git mv
命令,就跟使用git rm
和git add
的效果是一样的。git status
或git log
命令时,如果新增的文件和删除的文件足够相似,则它们会以移动的形式显示出来。Git不会利用仓库中的额外信息,如果你修改了移动的文件,系统会将其视为单独的添加和删除操作。Git通过比较新文件的内容与旧文件的内容来实现这一点。这发生在数据提交后,当你要求查看差异时。
默认的相似度阈值是50%。如果希望查看文件之间低于50%相似度的重命名操作,请向git dif-index
命令传递一个更低的百分比参数。例如,要跟踪重命名操作,即使文件差异达到75%,请使用以下命令:git diff-index -M25%
git log
、git diff
或git status
等命令时,Git会尝试猜测文件Y的历史记录,但实际上文件Y从未有过任何记录的历史。 - Dietrich Epp
git log
这样的东西吗? - Hackermanhg mv --after X Y
允许您告诉Mercurial文件X被重命名为Y,而不是保留X被删除和Y被添加的记录。请注意,即使文件X不再存在于工作目录中,它仍然可以工作。 - mark