为什么Git合并会删除文件而不是移动文件?

3
我有一个旧分支需要更新。我从主分支合并过来,但是有三个文件被移动了,Git 显示这些文件已经被“他们”删除了。
我首先尝试将文件移到新位置后再合并,但是 Git 只使用了分支文件,并没有尝试与主分支合并。
然后,我尝试设置:
git config merge.renameLimit 999999

但我得到了相同的结果。

有什么其他的办法可以强制 Git 认为这些文件是移动而不是被删除?文件名是一样的。


可能是因为标签内的内容不同,导致 Git 认为它们不相同。 - evolutionxbox
由于文件已经以新名称存在,Git未声明它为重命名的实际影响是什么? - jthill
@jthill 我想要合并这两个文件,而不是让其中一个覆盖另一个。 - parsley72
好的,所以这显示为冲突,由我们更改,被他们删除,但您希望由我们更改,由他们重命名(我猜测还有进一步的更改)? - jthill
@jthill 是的,类似那样。 - parsley72
1个回答

4

你遇到了Git记录快照和祖先的方法中一个(真正的)缺点:通常情况下,Git可以识别重命名的文件,因为它们看起来仍然很相似,但是如果你大幅度修改文件并将其移动,那么就没有任何区别来说明这个结果与旧文件被删除或在新位置上创建了一个新文件。

git checkout master^0                         # make a scratch commit to help Git
git mv new/path/to/file1 old/path/to/file1    # move the drastic-rewrite stuff back
git commit -m \
    'put drastically-changed-and-renamed files back where automerge can find them'

git checkout oldstuff                         # merge the helper commit to oldstuff
git merge @{1}                                # ...
git mv old/path/to/file1 new/path/to/file1    # put things in their new location
git commit --amend

Git的合并考虑到最新版本和基础。自从这些文件在“master”分支中的最新版本与与“oldstuff”合并基础时完全不一样,并且也已经移动了位置,所以合并不再将它们视为相同的文件。因此,将它们放回原来的位置以帮助Git自动合并,运行合并,然后再将它们移回到新位置。

直接回答标题问题,“为什么Git只记录快照和家谱”,这是一种工程权衡。无论你做什么都有缺点,你已经遇到了Git选择的缺点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接