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会将更改通知为删除和添加文件.
问题是什么?
如何在不丢失文件历史记录的情况下压缩包括重命名在内的提交?
Git 不直接跟踪重命名,它比较文件内容并通过相似性检测重命名。
当您压缩历史记录时,您会将文件的所有更改都放在一次提交中。与之前的提交相比,该文件可能会发生很大变化。因此它与之前的提交不是很相似,git 认为它是删除/添加。
如果您想查看此类文件的历史记录,您必须调整find-renames阈值。例如,对于 50% 的相似度使用
git log --follow --find-rename=50 -- someFile
Run Code Online (Sandbox Code Playgroud)
类似的选项也可用于diff、merge和rebase。看一下文档:
rename-threshold=n 控制用于重命名检测的相似性阈值。另请参阅 git-diff 1 -M。
--find-renames[=n]
检测重命名。如果指定了 n,则它是相似性索引的阈值(即与文件大小相比的添加/删除数量)。例如,-M90% 表示如果超过 90% 的文件没有更改,Git 应该将删除/添加对视为重命名。没有 % 符号,数字将被读作分数,在它之前有一个小数点。即,-M5变为0.5,因此与-M50%相同。同样,-M05 与-M5% 相同。要将检测限制为精确重命名,请使用 -M100%。默认相似度指数为 50%。