当我们使用支持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中)
由于
波阿斯
答案 0 :(得分:0)
Git的git log --follow
是一个俗气的黑客。
它的作用是告诉Git,当它回来时,提交提交,如果它检测到你是git log
的(单个)文件已被重命名,它应该开始寻找提交这会影响旧名称。
由于您询问具有该名称的 new 文件,Git会向您显示具有新名称的新提交。然后它找到一个具有名称为A.java
的文件的提交,因此它会向您显示提交...即使这里的A.java
是不同 {{1 }}
可以改进黑客攻击:如果你正在使用A.java
并且Git检测到重命名 你正在关注的名称,那么Git就可以停在那里,而不是显示提交而不是走那个提交的父母。 (这纯粹出于技术原因很难,而不仅仅是改进黑客攻击,写一个真正的追随者会更好,但这更难。)