我遇到git merge问题,它说文件更改和重命名操作之间存在冲突。分支是这样完成的:
错误示例:
Auto-merging ui-app/css/images/icons-retina/item-unselected.png
CONFLICT (add/add): Merge conflict in ui-app/css/images/icons-retina/item-unselected.png
CONFLICT (rename/delete): ui-app/css/images/icons-retina/item-selected.png deleted in HEAD and renamed in fixed_toolbar. Version fixed_toolbar of ui-app/css/images/icons-retina/item-selected.png left in tree.
当我尝试接受我们的版本时,它说没有这样的版本(但它们肯定在分支中):
git checkout --ours -- ui-app/css/images/icons-retina/item-*.png
error: path 'ui-app/css/images/icons-retina/item-unselected.png' does not have our version
error: path 'ui-app/css/images/icons-retina/item-selected.png' does not have our version
答案 0 :(得分:6)
永远不要从可能被重新定位的东西中分支出来,和/或永远不要将任何可能分支的东西重新分支!
你有以下历史:
base - b1 - b2 - b3 -
\ \
\ more_design' - m1' - m2' - m3' - m4' >?
\ ..
more_design - m1 - m2 - m3 - m4 ..
\ ..
fixed_toolbar - f1 - f2
重新定位more_design
以上创建全新版本的历史记录。您现在拥有 m1'.. m4',而不是 m1..m4 。就git而言,这些是完全不同的修订。所以最近的共同祖先是 base !因此,“本地”更改为 m1'+ m2'+ m3'+ m4',“远程”更改为 m1 + m2 + f1 + f2 。由于 m3'和 m4'会覆盖 m1 和 m2 中的更改,因此您会遇到冲突。
解决方案是将 rebase fixed_toolbar改为rebased more_design分支。
git checkout fixed_toolbar
git rebase --onto more_design original_more_design
或通过使用交互式合并并手动删除修订版m1和m2,如果git无法识别它们;它通常会:
git checkout fixed_toolbar
git rebase -i more_design
而且只是合并。或者挑选fixed_toolbar中的变化;最近的git应该理解
git cherry-pick original_more_design..fixed_toolbar