我在git上提交了一个文件,它有几个变化,但与旧文件没有完全不同。 git并没有挑出变化,而是做了一次大的删除;整个文件和一个大插入;新文件。这是一个错误,显然有很大的不变部分,例如该文件从一些“使用”语句开始,其中没有任何变化。更正整个文件的Git替换
这很烦人,因为这意味着我会失去所有的“责备”历史。
有没有办法让git重做diff?我能做些什么来造成这种情况?发生这种情况时,我正在合并另一个分支。
我在git上提交了一个文件,它有几个变化,但与旧文件没有完全不同。 git并没有挑出变化,而是做了一次大的删除;整个文件和一个大插入;新文件。这是一个错误,显然有很大的不变部分,例如该文件从一些“使用”语句开始,其中没有任何变化。更正整个文件的Git替换
这很烦人,因为这意味着我会失去所有的“责备”历史。
有没有办法让git重做diff?我能做些什么来造成这种情况?发生这种情况时,我正在合并另一个分支。
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
选项应该为你做的伎俩。
我的理解是,这只适用于某一点,当提交被存储时,它们原本是作为完整的快照存储的,然而,git经常运行压缩算法并创建包文件,一旦发生这种情况,可能历史提交将被存储为增量,而最新版本的快照将被原封不动地存储。它们也会被添加为完整的快照,直到packfile例程再次运行。 – 2013-04-25 14:31:40
@JosephDeCarlo,是的,但我瘦了krcomblen正在讨论语义,从这个观点来看,Git只能处理快照。 – kostix 2013-04-25 14:42:51
@kostix ahhh ...好点。当我读到rcomblen的答案时,这让我质疑我是如何知道它的工作原理的,所以我查了一遍,重新阅读了这一章。一旦我证实我的记忆是正确的,我想我只是为了清晰起见而发布它。 – 2013-04-25 14:47:45
您确定这些行中没有空白或行结束更改吗? git diff --ignore-space-change是什么意思? – 2013-04-25 13:34:20
肯定会在文件内寻找不可见的字符变化(或类似转换为空格的制表符 – 2013-04-25 13:36:52
Aha!由于某些原因合并了一些不同的行结尾已经在文件中结束了,Visual Studio发现它并建议我规范化...所以 – Stefan 2013-04-25 13:40:01