Git squash提交重命名文件(保存历史记录)

时间:2015-02-19 12:10:35

标签: git rename git-rebase squash git-squash

底色

嗨,我正在本地功能分支上工作。这个本地分支搞砸了许多小提交。在将分支推到遥控器之前,我想整理一下。

为此,我做了一个交互式的反思:

git rebase -i

到目前为止没问题。

问题

现在,这是困难的部分: 在功能开发期间,我已经完成了几次重构,包括重命名移动文件。 重命名文件的历史记录可用,因为它们使用以下命令重命名:

git -mv

但是当我在重命名提交之前和之后压缩提交时,历史记录就消失了,git会将更改通知为删除和添加文件。

问题是什么?

如何在不丢失文件历史记录的情况下压缩包括重命名在内的提交?

1 个答案:

答案 0 :(得分:2)

Git不会直接跟踪重命名,它会比较文件内容并按相似性检测重命名。

当您压缩历史记录时,您将文件的所有更改都放在一次提交中。与之前的提交相比,该文件可能会发生很大变化。因此它与之前的提交不太相似,git认为它是删除/添加。

如果要查看此类文件的历史记录,则必须调整find-renames阈值。例如。 50%的相似度使用

git log --follow --find-rename=50 -- someFile

diffmergerebase也可以使用类似的选项。 看看文档:

git rebase

  

重命名阈值= N   控制用于重命名检测的相似性阈值。另见git-diff 1 -M。

git diff

  

- 发现 - 重命名[= N]

     

检测重命名。如果指定n,则它是相似性指数的阈值(即,与文件大小相比的添加/删除量)。例如,-M90%表示如果超过90%的文件未更改,Git应将删除/添加对视为重命名。如果没有%符号,则该数字将作为分数读取,并在其前面加上小数点。即,-M5变为0.5,因此与-M50%相同。同样,-M05与-M5%相同。要将检测限制为精确重命名,请使用-M100%。 默认相似性指数为50%