Git 吉特认为我';我重命名了一个文件,而不是删除一个并创建另一个

Git 吉特认为我';我重命名了一个文件,而不是删除一个并创建另一个,git,Git,$git状态: renamed: test.foo -> database/migrations/.gitignore 实际发生的是我删除了test.foo,它是空的,并创建了一个空的.gitignore 我想它认为这些文件是相同的,因为它们都是空的。这对后来的历史有点误导——我宁愿它是准确的 如何解决此问题并使其将已删除的文件显示为已删除,将新文件显示为已创建?您可以: git rm --cached .gitignore git commit -m "delete test.f

$git状态

renamed:    test.foo -> database/migrations/.gitignore
实际发生的是我删除了
test.foo
,它是空的,并创建了一个空的
.gitignore

我想它认为这些文件是相同的,因为它们都是空的。这对后来的历史有点误导——我宁愿它是准确的

如何解决此问题并使其将已删除的文件显示为已删除,将新文件显示为已创建?

您可以:

git rm --cached .gitignore
git commit -m "delete test.foo"
git add .gitignore
这将有助于将这两项行动分开

  • 首先取消跟踪
    .gitignore
    ,同时保持
    test.foo
    在索引中被删除
  • 然后跟踪(
    git add
    .gitignore

这将避免重命名启发式(请参见“”)混淆。

没有理由做任何事情。在内部,git中的重命名是不可能的——它们总是被视为先删除,然后追加。然而,git有一些启发式方法来帮助人们理解文件被重命名。这些启发式算法基于新文件与旧文件的相似程度

就像您的案例一样,这种启发式可能“太”有用了。然而,这可能会通过较新的git版本得到解决,因为对象存储格式不需要更改以区别对待这些启发式


您可能希望提交错误请求,以使空文件永远不会被视为重命名。

重命名实际上不在git历史记录中-它是一种运行时启发式方法,可以为
git status
和其他一些git命令打印漂亮的消息。我同意您不必做任何事情,但我还是喜欢在不同的提交中保留不同的任务:在OP的情况下,隔离删除
test.foo
应该不会有什么坏处。@VonC:这取决于上下文。然而,当提交逻辑上需要添加一个并删除另一个时,用额外的伪提交来污染git历史记录似乎也不是一个好的解决方案