为什么git合并我没有修改过的东西?

时间:2013-03-01 07:51:33

标签: git

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

  1. base - > more_design
  2. more_design中的一些变化
  3. more_design - > fixed_toolbar
  4. fixed_toolbar最小更改(PNG文件无更改)
  5. 修改more_design
  6. 中的PNG文件
  7. 将more_design改为基础(PNG文件无变化)
  8. 尝试从fixed_toolbar合并(git在PNG文件上混淆)
  9. 错误示例:

    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
    

1 个答案:

答案 0 :(得分:6)

Rebase和merge不要混用!

永远不要从可能被重新定位的东西中分支出来,和/或永远不要将任何可能分支的东西重新分支!

你有以下历史:

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