Git错误地推断"重命名"

时间:2017-11-14 08:57:56

标签: git

Git已推断出"重命名"当我不想这样做时(这个问题实际上是相反的,比如,How to make git mark a deleted and a new file as a file move?):

  1. 我创建了一个新文件,并git add。 (我没有做git commit,因为我现阶段不想这样做。)
  2. 后来我在另一个档案上做了git rm
  3. 现在git status报告renamed: old-file -> new-file。我还没有commit
  4. 这两个文件位于同一目录中,具有相似名称和一定数量的常见内容。但是,我故意做一个git mv,因为这是而不是重命名,我希望单独跟踪这两个文件。如果我想要重命名,我会做git mv而不是我的故意git add / git rm

    该活动导致git决定重命名,并且可以告诉他们不要试图推断我不想要的内容吗?

3 个答案:

答案 0 :(得分:2)

Git的逻辑underlying storage model仅存储更改前后的repo内容,而不是更改本身。所以它无法区分,例如,移动+修改和删除+添加。

因此ps aux | grep python仅为convenience syntax

git mv

mv a b git rm a git add b 仅仅是推断潜在变化的最可能原因(在之前和之后给出),以努力使人类可读输出有用。肯定存在病态边缘情况 - 在您的特定情况下,它推断出变化是由移动和内容变化引起的。

根据评论讨论更新:如果您需要明确此处发生的事情,您可以(按照建议)执行git status和{{1在单独的提交中。这有分裂单个"逻辑"的缺点。承诺两个,虽然这可能不重要。

答案 1 :(得分:1)

文件足够相似,以便git status认为它是重命名。在幕后,它根本没有任何区别,但是如果你想确保它不会发生,那么在你添加和删除文件的地方进行单独的提交:

git add newfile
git commit
git rm oldfile
git commit

答案 2 :(得分:1)

只要在历史记录中的任何一对提交之间计算差异时,Git都会在检测到相似内容的删除和添加(默认情况下相似为50%)时推断重命名。也就是说,Git不会将删除和添加记录为重命名,因此,如果您进行git rm ...git add ...,或者只是git mv ...(基本上是另外两个别名)

Git会推断重命名,除非您告诉它不要这样做,但要当心:如果您告诉Git不推断重命名,那么它将不会推断任何重命名,即使您想要配对为重命名的那些删除和添加。

有关更多详细信息,我建议阅读gitdiffcore的文档。