当我们使用支持 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 可能会停在那里,不显示该提交,也不遍历该提交的父级。 (由于纯粹的技术原因,这很困难,而不仅仅是改进黑客,最好写一个真正的追随者,但这要困难得多。