Git 重命名并使用相同的旧名称创建新文件 - git 日志预期行为



当我们使用支持 ID 跟踪的 VCS 时,当我们想要从给定实现中提取接口时,我们有共同的模式

Rename file A.java to AImp.java
Create new file A.java

我们这样做,因为想要完整的 AImp 历史记录.java(并且从旧 A 合并.java将被合并到 AImp.java)

现在我们转移到 Git,我想重复这个模式:

echo "class A {}" > A.java
git add .
git commit -m "new class A"
git mv A.java  AImp.java
git commit -m "rename A->Aimp"
echo "interface A {}" > A.java
git add .
git commit -m "create new interface A"

我正在两个单独的提交中进行重命名和添加,因此重命名检测有效。当前的历史是这样的:

e7579fb (HEAD -> master) create new interface A
610a9b3 rename A->Aimp
b94e8bf new class A

但是(在我看来)A.java的历史是错误的:

git log --oneline --follow A.java
e7579fb (HEAD -> master) create new interface A
610a9b3 rename A->Aimp
b94e8bf new class A

我希望只看到:

e7579fb (HEAD -> master) create new interface A

你觉得怎么样?

(我知道由于重命名检测算法,我不能指望从旧的 A.java 合并到 Aimp.java)

谢谢

波阿斯

Git 的git log --follow是一个俗气的黑客。

所做的是告诉 Git,当它工作回来时,通过提交提交,如果它检测到您正在git log -ing 的(单个)文件已被重命名,它应该开始寻找影响旧名称的提交。

由于您询问的是具有该名称的新文件,因此 Git 会向您显示具有新名称的新提交。 然后它会找到一个提交,其中包含一个名为 A.java 的文件,因此它也向您显示该提交......即使这里的A.java不同的A.java.

黑客可以改进:如果您使用 --follow 运行并且 Git 检测到重命名为您关注的名称,Git 可能会停在那里,不显示该提交,也不遍历该提交的父级。 (由于纯粹的技术原因,这很困难,而不仅仅是改进黑客,最好写一个真正的追随者,但这要困难得多。

最新更新