首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Git重命名并使用相同的旧名称创建新文件- git记录预期行为?

Git重命名并使用相同的旧名称创建新文件- git记录预期行为?
EN

Stack Overflow用户
提问于 2017-10-24 01:43:55
回答 1查看 36关注 0票数 0

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

代码语言:javascript
复制
Rename file A.java to AImp.java
Create new file A.java

我们这样做是因为我们想要AImp.java的完整历史(旧A.java的合并将被合并到AImp.java中)

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

代码语言:javascript
复制
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"

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

代码语言:javascript
复制
e7579fb (HEAD -> master) create new interface A
610a9b3 rename A->Aimp
b94e8bf new class A

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

代码语言:javascript
复制
git log --oneline --follow A.java

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

我只希望看到:

代码语言:javascript
复制
e7579fb (HEAD -> master) create new interface A

你觉得呢?

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

谢谢

波阿斯

EN

回答 1

Stack Overflow用户

发布于 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就会停在那里,不显示该提交,也不遍历该提交的父级。(由于纯粹的技术原因,这是困难的,而不仅仅是改进黑客,写一个真正的追随者会更好,但这要困难得多。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46895442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档