为什么Git在重命名后会保留以前的目录(比如复制目录)?

为什么Git在重命名后会保留以前的目录(比如复制目录)?,git,Git,有这样一种情况,假设我有dev分支和这样的项目结构MyProj/Foo/MyFile.java。 然后我先进行checkoutdev->dev test,然后放入一些文件并进行提交,现在看起来是这样的 MyProj/Foo/MyFile.java MyProj/Foo/MyFile2.java MyProj/Foo/MyFile3.java 现在,我从dev->dev test second中再签出一次,首先将Foo目录重命名为Boo,然后删除MyFile.java,添加MyFile4.ja

有这样一种情况,假设我有
dev
分支和这样的项目结构
MyProj/Foo/MyFile.java
。 然后我先进行checkout
dev->dev test
,然后放入一些文件并进行提交,现在看起来是这样的

MyProj/Foo/MyFile.java
MyProj/Foo/MyFile2.java
MyProj/Foo/MyFile3.java 
现在,我从
dev->dev test second
中再签出一次,首先将
Foo
目录重命名为
Boo
,然后删除
MyFile.java
,添加
MyFile4.java
,并提交它

dev第二次测试的结果
br

MyProj/Boo/MyFile4.java
最后,我将这两个分支
devtestfirst
devtestsecond
与main
dev
分支合并

我期望得到什么

这个

对吧??但实际上这就是我得到的

MyProj/Foo/MyFile2.java
MyProj/Foo/MyFile3.java 
MyProj/Boo/MyFile4.java
git没有重命名,而是持有两个dir
Boo
Foo
,尽管它被重命名了


问题是:为什么会发生这种意外行为?

Git跟踪内容。目录只作为跟踪内容的路径进行跟踪,而不是作为任何值得关注的内容进行跟踪。提交告诉您他们正在记录的效果,您的开发测试第二次提交应该说~delete Foo/MyFile.java;创建Boo/MyFile4.java~。

我没有真正理解你的问题。你能发布一个简短的片段和你得到的准确输出吗?@Maroun Case是-我有dev br->从dev
第一个和第二个
->多做两个分支br我在第二个添加两个新文件br我重命名dir,删除文件并添加另一个文件->然后将这两个分支
第一个和第二个
合并到
dev
。然后,我在问题的最后公布了预期和实际结果。相反,所有文件都存在于重命名的dir-Boo中,我看到两个dir,一个是
Foo
(初始dir)和
Boo
重命名的dir。。。你明白我的意思了吗?对我来说,这是期望你将一个分支与…/foo/stuff和…/bar/stuff合并。重命名是独立的。是的,关于
MyFile.java
它被删除了,编辑了我的问题,你是对的。但无论如何,我希望看到重命名目录下的所有文件
Boo
。。。所以,这意味着,假设两个开发人员在diff分支上工作,其中一个重命名一个dir,然后进行合并,因此,有人必须进行重构,并将所有文件放在单个dir下,就像我的问题中的
Boo
,因为在这种情况下,文件不应该在diff dirs中。。。对吗?如果您记住目录是路径名的一部分,那么您就可以轻松地使用它了。实现这一机制的痛苦/收益比太高了,我对这一意外表示同情,但Git不会帮助您,移动一个文件不会被合并为移动其他文件的命令。你必须自己移动它们。
MyProj/Foo/MyFile2.java
MyProj/Foo/MyFile3.java 
MyProj/Boo/MyFile4.java