当我们使用支持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)
谢谢
波阿斯
发布于 2017-10-24 02:00:25
Git的git log --follow是一个俗气的黑客。
它所做的是告诉Git,当它返回时,一次又一次提交,如果它检测到你是git log-ing的(单个)文件已经被重命名,它应该开始寻找影响旧名称的提交。
由于您询问的是具有该名称的新文件,因此Git将向您显示具有新名称的新提交。然后,它会找到一个包含名为A.java的文件的commit,所以它也会向您显示commit ...尽管这里的A.java是一个不同的A.java。
黑客攻击可以改进:如果你使用--follow运行,而Git检测到你正在跟踪的名称被重命名,Git就会停在那里,不显示该提交,也不遍历该提交的父级。(由于纯粹的技术原因,这是困难的,而不仅仅是改进黑客,写一个真正的追随者会更好,但这要困难得多。)
https://stackoverflow.com/questions/46895442
复制相似问题