我有这个奇怪的问题,Git合并我无法解释或分类.这是一个缺失的提交.合并出错了吗?它是否已损坏数据?以下是存储库历史记录的样子:
master----\----commit A----cherry-picked changesets from topic---commit B--\----commit C----merge---
           \                                                                \              /
            topic-----------------------------------------------------------merge---------/
现在,我的问题是,当它master被合并到topic分支中时(为了使它与提交A和B保持同步),提交B引入的变更集就不存在了!如果提交B在修改文件foo及bar,甚至有很多不显示这些文件与合并而改变.文件foo和文件中甚至没有任何冲突bar
现在,当我合并topic  回来时master,提交B是有效的反转,没有任何日志或逆转的痕迹!
什么可能出错?
Jan*_*dec 11
master----\----commit A----cherry-picked changesets from topic---commit B--\----commit C----merge---
           \                                                                \              /
            topic-----------------------------------------------------------merge---------/
                                                                            ~~~~~
                                                                              ^
                                                                              + here you merged B in topic
主题中已经有一个合并,它将提交B作为父级.所以B在主题中完全合并,不再在任何地方合并.
由于您没有主题中的更改,因此您显然已在主题上还原它们,无论是在合并本身还是在后续提交中.这种反转是合并算法的常规提交,并且它不会合并到master中.因此,当您将主题合并到主服务器时,此提交的更改将被合并,还原提交B.
要从B返回更改,您必须:
git cherry-pick B)主题.没有你意识到这些变化可能会如何逆转?如果你正在合并并且发生冲突,你可以使用"本地"思维来解决它们,你还不需要这些改变.但是从Git(或任何其他版本控制系统的问题; 3路合并在所有这些中的工作方式相同)的观点来看,你已经看到了变化并拒绝了它们,所以你永远不会再得到它们了,除非您手动重新应用它们.
早期的挑选可能很容易造成冲突.虽然算法不会声明冲突,如果双方看起来相同,因此如果你挑选和合并,如果你在一边修改樱桃选择的代码,它将宣布冲突.说你有:
----\-- A -------- B' -- B2 --\
     \                         \
      D -- B -- E -----------merge
其中,B'挑选B和B2修改了相同的代码B一样.在这种情况下,合并将看到一方做了B而另一方做了B2,因为樱桃选择被隐藏,B2因此将宣布B和之间的冲突B2.如果你不仔细看历史,你可能很容易解决这个错误.你可以避免这个问题,如果在选择提交时你将目标分支合并到源代码中,就像这样:
----\-- A --------\- B' -\- B2 --\
     \             \      \       \
      D -- B -- E --m1-----m2----merge
哪里m1是正常合并,没有涉及樱桃选择,并m2使用本地版本解决,因为它只在远程选择了樱桃.这将确保进一步合并将正常工作.
实际上应该可以为git编写合并策略来自动执行此操作.
| 归档时间: | 
 | 
| 查看次数: | 14648 次 | 
| 最近记录: |