Git已推断出"重命名"当我不想这样做时(这个问题实际上是相反的,比如,How to make git mark a deleted and a new file as a file move?):
git add
。 (我没有做git commit
,因为我现阶段不想这样做。)git rm
。git status
报告renamed: old-file -> new-file
。我还没有commit
。这两个文件位于同一目录中,具有相似名称和一定数量的常见内容。但是,我故意不做一个git mv
,因为这是而不是重命名,我希望单独跟踪这两个文件。如果我想要重命名,我会做git mv
而不是我的故意git add
/ git rm
。
该活动导致git
决定重命名,并且可以告诉他们不要试图推断我不想要的内容吗?
答案 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的文档。