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

Ram*_*Now 7 git rename git-rebase squash git-squash

底色

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

为此,我会做一个交互式的rebase:

git rebase -i
Run Code Online (Sandbox Code Playgroud)

到目前为止没问题.

问题

现在这里是困难的部分:在功能开发过程中,我做了几次重构,包括重命名和文件移动.重命名文件的历史记录可用,因为它们使用以下命令重命名:

git -mv
Run Code Online (Sandbox Code Playgroud)

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

问题是什么?

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

Ren*_*ink 6

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

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

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

git log --follow --find-rename=50 -- someFile
Run Code Online (Sandbox Code Playgroud)

类似的选项也可用于diffmergerebase。看一下文档:

git rebase

rename-threshold=n 控制用于重命名检测的相似性阈值。另请参阅 git-diff 1 -M。

混帐差异

--find-renames[=n]

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

  • 感谢您的回答。所以,用`git mv`重命名文件实际上并没有告诉git保留文件的历史记录,而是只是重命名文件,然后它会自动检测到文件已被重命名?换句话说:没有可能做我想做的事?唯一的可能性是在单独的提交中进行重命名。 (2认同)