【问题标题】:Git rename and create new file with the same old name - git log expected behavior?Git重命名并使用相同的旧名称创建新文件 - git log 预期行为?
【发布时间】:2018-04-04 08:39:22
【问题描述】:

当我们使用支持 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 rename


    【解决方案1】:

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

    它的作用是告诉 Git,当它返回时,逐个提交提交,如果它检测到你是 git log-ing 的(单个)文件已被重命名,它应该开始寻找影响旧名。

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-11
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2017-06-08
      • 2011-02-11
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多