2013-04-25 79 views
1

我在git上提交了一个文件,它有几个变化,但与旧文件没有完全不同。 git并没有挑出变化,而是做了一次大的删除;整个文件和一个大插入;新文件。这是一个错误,显然有很大的不变部分,例如该文件从一些“使用”语句开始,其中没有任何变化。更正整个文件的Git替换

这很烦人,因为这意味着我会失去所有的“责备”历史。

有没有办法让git重做diff?我能做些什么来造成这种情况?发生这种情况时,我正在合并另一个分支。

+3

您确定这些行中没有空白或行结束更改吗? git diff --ignore-space-change是什么意思? – 2013-04-25 13:34:20

+2

肯定会在文件内寻找不可见的字符变化(或类似转换为空格的制表符 – 2013-04-25 13:36:52

+0

Aha!由于某些原因合并了一些不同的行结尾已经在文件中结束了,Visual Studio发现它并建议我规范化...所以 – Stefan 2013-04-25 13:40:01

回答

0

Git不存储差异,它只是为每次提交存储一个文件树的版本。由git show创建的差异不是存储在Git内部数据库中的。

在你的情况,你可以看到该文件已被重命名,如果你使用的git diff

-M[<n>], --find-renames[=<n>] 
     Detect renames. If n is specified, it is a threshold on the similarity index (i.e. amount of addition/deletions compared to the file’s size). 
     For example, -M90% means git should consider a delete/add pair to be a rename if more than 90% of the file hasn’t changed. 

-M选项应该为你做的伎俩。

+0

我的理解是,这只适用于某一点,当提交被存储时,它们原本是作为完整的快照存储的,然而,git经常运行压缩算法并创建包文件,一旦发生这种情况,可能历史提交将被存储为增量,而最新版本的快照将被原封不动地存储。它们也会被添加为完整的快照,直到packfile例程再次运行。 – 2013-04-25 14:31:40

+0

@JosephDeCarlo,是的,但我瘦了krcomblen正在讨论语义,从这个观点来看,Git只能处理快照。 – kostix 2013-04-25 14:42:51

+0

@kostix ahhh ...好点。当我读到rcomblen的答案时,这让我质疑我是如何知道它的工作原理的,所以我查了一遍,重新阅读了这一章。一旦我证实我的记忆是正确的,我想我只是为了清晰起见而发布它。 – 2013-04-25 14:47:45