初始情况:
M0 ----- M1 -- M2 -- M3 -- M4 -- M5
|-- A1 --/\ | |
\-- B1 ---|----/ |
--------- A2 ---------/
2个开发人员正在一个存储库上工作,两者都从M0分支开始。开发人员A在分支A1上工作,完成后将其合并为M1进入主分支。他直接创建一个新的分支,使用特征A2。 B同时正在B1上工作,并在完成后合并到M2中。但是,在此合并期间,将放弃在M1中所做的一些重要更改。 B在顶部(M3,M4)创建更多提交。当A完成在A2上的工作并想重新合并到主服务器(M5)中时,已在M1中引入并因此属于M2的更改将被删除/甚至不会显示为冲突。 (->我猜这是预期的行为,因为M4和A2共享同一父M1?)
当前状态:
M0 ----- M1 -- M2 -- M3 -- M4
|-- A1 --/\ /
\-- B1 ---|---<
|----\----- A2 ----------\
M1---M2*-- M3* -- M4* -- M5
为解决此问题,我从M1创建了一个新分支,然后重新合并(M2 *)。然后,我进行了一个基础调整,以在M2 *之上添加M3 *和M4 *。最后,我能够将A2合并为M4 *,从而获得所需的M5。不幸的是,M4已经被推到了原处。因此,如果我想在M5上打开请求请求,这将再次引入M2的错误版本。
->因此,我的下一步是执行git push --force origin master
(同时确保开发人员B已完成所有更改)。是建议使用此整体解决方法,还是有一种更好的方法来处理所描述的情况?
答案 0 :(得分:0)
如果“重写历史记录”是一个选项,我将检出M2
,对其进行更正和修改(在修改后称为M2'
),那么我会选择M2..M4
然后合并A2
,创建M5'
。然后,我将分支(main?)指向M5'
,那将是它的结尾(强制将其推到需要的位置)。
作为补充说明,否,将A2
与M4
合并时应该没有冲突,因为代码已被删除,这与祖先无关紧要(除非删除的代码涉及A2
上完成的工作所涉及的代码。