我通常没有使用git重命名的问题,但我遇到了一个非常棘手的问题需要解决。
由于某些早期的决定,我们有一个文件dir1/file
,它完全在错误的位置,并且需要移动到dir2/file
。
然而,有很多代码需要更改,出于各种原因,我们必须将文件保留在新位置和旧位置一段时间。
因此,自然(或近似自然)的方法是这样做:
git mv dir1/file dir2/file
git commit -a
到目前为止,一切都很顺利:
> git diff master --name-status --find-renames
R100 dir1/file dir2/file
那么,我们接下来要做什么。
ln -s ../dir2/file dir1/file
git commit -a
但是这种情况发生了。
> git diff master --name-status --find-renames
A dir2/file
T dir1/file
如果有人在主分支上更改了
dir1/file
,当我尝试拉取时会被告知与dir1/file1
存在合并冲突,而dir2/file1
则保持不变。从其他帖子中的阅读中,我认为Git跟踪内容,但它似乎也跟踪文件名以及内容。完全忽略了内容已经移动的事实。那么,我该如何让Git认识到我已经重命名了一个文件,并添加了一个新文件,这个新文件恰好与旧文件同名?
注意:我不想进行多次推送。有几个受影响的文件都是这种情况,同时有人在并行地对其中之一进行更改的可能性很高,而且不能保证他们能够进行拉取以获取重命名,然后进行拉取以获取软链接。
附加示例。我正在从Python模块
__init__.py
中删除一个函数,这个函数本来就不应该在里面,__init__.py
应该是空的。这也没有被识别为重命名。即使新文件的内容与原始__init__.py
的内容99%相同,新__init__.py
的内容与旧内容的0%相同。一切都很好,直到我添加了一个同名文件。