2

简单场景:

偏僻的:

git init
touch a.py && git add a.py && git commit -am "Add a.py"
touch b.py && git add b.py && git commit -am "Add b.py"

当地的:

git clone REMOTE_URL
echo "Bob Loblaw" >> a.py && git commit -am "Append to a.py"

偏僻的:

git rm a.py && git commit -am "Remove a.py"

当地的:

git fetch origin
git rebase origin/master

输出:

$ cat b.py
Bob Loblaw

为什么我对 a.py 的本地更改应用于 b.py 而不是发生 rebase 冲突,例如

CONFLICT (delete/modify): a.py deleted in HEAD and modified in Append to a.py. Version Append to a.py of a.py left in tree.

如果它有所作为,我使用的是 git 版本 1.7.4.1。

4

2 回答 2

1

我以前听说过这个奇怪的问题。

问题源于其内容相同的a.py事实b.py

Git使用基于内容的启发式方法来检测文件重命名,在您的情况下,启发式方法将删除a.py与重命名为相同的 to混淆了b.py,因为它们都是空的并且应用的更改非常小。

recursive发生这种情况是因为根据文档,默认的合并策略,

可以检测和处理涉及重命名的合并

显然,这在现代版本的 git 中已得到修复/改进,因为在我的机器上我无法重现 Git v1.8.1.3 的问题。

您可以更新您的 Git(强烈建议)或尝试使用不处理重命名的不同合并策略,例如resolve(尽管它有一些缺点,请阅读文档以获取更多信息)。

编辑

另一种选择是使用合并策略的--rename-threshold选项,将其设置为,根据will的文档recursiveM100%git-diff

将检测限制为精确重命名

git 命令将是

git rebase -Xrename-threshold=M100% origin/master
于 2013-04-10T00:07:24.417 回答
0

按照您的步骤操作时,我在变基期间确实遇到了合并冲突(应该是这样):

gittest/loc$ git rebase origin/master
[...]
CONFLICT (modify/delete): a.py deleted in HEAD and modified in Append to a.py.
Version Append to a.py of a.py left in tree.
Failed to merge in the changes.

您可能做了一些微妙的不同 - 或者您的 git 安装有问题或 git 中的错误(尽管这似乎不太可能)。

我在 Debian Linux 上使用了 git 1.8.1.1。

于 2013-04-09T23:46:58.617 回答