1

我有一个 git merge 问题,它说文件更改和重命名操作之间存在冲突。分支是这样完成的:

  1. 基础-> more_design
  2. more_design 的一些变化
  3. 更多设计-> 固定工具栏
  4. fixed_toolbar 最小更改(PNG 文件中没有更改)
  5. 在more_design中修改PNG文件
  6. 将 more_design 重新设置为基础(PNG 文件中没有更改)
  7. 尝试从 fixed_toolbar 合并(git 对 PNG 文件感到困惑)

错误示例:

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
4

1 回答 1

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'覆盖了m1m2中的更改,所以你会遇到冲突。

解决方案是将fixed_toolbar重新定位到重新定位的 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
于 2013-03-01T08:01:26.310 回答