git的-X"他们的"不能处理新的/删除的文件冲突吗?

Ben*_*jol 11 git conflict rebase

这个问题的情景之后,我正在表演git rebase -s recursive -X theirs etc...并且很惊讶地被以下类型的冲突所阻止:

  • 他们补充道
  • 他们删除了
  • 我们删除了

这个策略有没有理由不应对这些?

(我不知道这是否重要,但是git不报告输出中的冲突,它只是说When you have resolved this problem run "git rebase --continue")

更新这里的脚本不能完全重现,但几乎:

git init
git symbolic-ref HEAD refs/heads/Branch1  #just to get the 'right' branch name
echo Added in A > DeletedByThem.txt
git add -A
git commit -m A

echo Modified in B >> DeletedByThem.txt
git add -A
git commit -m B

echo Modified in C >> DeletedByThem.txt
echo Added in C > DeletedByUs.txt
git add -A
git commit -m C

git checkout -b Branch2
echo Modified in D >> DeletedByUs.txt
git rm DeletedByThem.txt
git add -A
git commit -m D

echo Modified in E >> DeletedByUs.txt
git add -A
git commit -m E
Run Code Online (Sandbox Code Playgroud)

在这一点上,你应该有这个:

Branch1:    A - B - C
                     \
Branch2:              D - E
Run Code Online (Sandbox Code Playgroud)

我们想要的是:

Branch1:    A - B - C
                 \
Branch2:          D - E
Run Code Online (Sandbox Code Playgroud)

所以:

git rebase -s recursive -X theirs --onto [SHA of B] Branch1 Branch2
Run Code Online (Sandbox Code Playgroud)

这复制了"由他们删除"和"由我们删除"的问题,但没有重现"由他们添加",也没有重现任何冲突报告.

从我可以收集到的,在这个上下文中"被他们删除"因此意味着"在B之后修改,然后删除"(所以我们确实想在Branch2中删除它),"我们删除"意味着"在B之后创建"(所以我们想把它保存在Branch2中)

从我从真实(和巨大)回购的历史中可以看出,"由他们添加"与错误检测到的重命名有关(即,完全不同的文件夹中的相同文件被识别为重命名).

Ada*_*ruk 2

发生冲突的原因是因为 rebase 正在尝试应用无法应用的补丁。

补丁指示我们删除的文件,它找不到。

此行为是设计使然。