UPDATE:根据您的更新问题
,我明白为什么文件缺失发生。这对我来说似乎是一种不寻常的情况组合。最有趣的一点是,合并的恢复比初看起来更加危险。撤销合并(通过重置清除历史记录之前将其从历史记录中清除)是典型的过程,并且可以避免这种问题 - 如果问题在推送之前被捕获。但这在这里和现在没有太大的帮助。
虽然有所澄清,但我仍建议您不要对您提出的历史编辑进行修改,并且我所有关于该修改的建议都包含在我的原始答案中。请记住,如果您通过修改release
提交,release
将仍然具有原始提交,并且您将有一个奇怪的,分裂的历史记录容易在某些合并操作中发生冲突(因为重复的提交执行相同的操作) 。
如果您想将M1的所有更改恢复到历史记录中,可以通过回复W1来减少头痛。你仍然可能会遇到一些冲突,但是从一开始就简单得多。不会造成上游发生重组问题;并且让您在路上看到更少的冲突合并。
这听起来像你正在考虑编辑发布分支的历史。为了短期的原因(需要“上游调整”resoultion)和长期原因(发布部门不再记录发布的内容),我建议不要这样做。当然,我可能误会你提出什么,让我们得到一个共同的出发点:
您目前有类似
O --- x --- x --- x --- M2 <--(master)
\ \ /
\ x --- M1 --- W1 <--(release)
\ /
A ----- B --- C --- D <--(feature)
其中M1
是的feature
一个错误的合并成release
,W1
恢复M1
和M2
是release
最终合并为master
。
据我所知,所有这一切都被推动,其中一些反映在您的发布版本的历史中,并且“问题”提交也已经是master
的共享历史的一部分。所以如果是我,我会认为几乎所有这些都是“石头写的”。
如果你最终决定使用变基“修理”的发布分支,两件事情要考虑:
1)这将是最好的发布分支历史删除M1
和W1
,使至少它的结果树是你发布的东西的正确反映。 (我认识到,最终从M1
工作将被重新推出,但是这不是你发布的内容。)
2)做到了这一点,你不得不重做M2
合并使用新release
(创建M2'
) ref,然后rebasease master
,以及从master
分支的所有其他从M2
到M2'
的分支。如果这是一个积极的回购,它可以迅速蜘蛛网。
这就是为什么我不会。那么你还能做什么?
这听起来像release
出来看,因为它应该,所以这是我不清楚为什么这会对master
任何不良影响,直到您尝试合并feature
。毕竟,如果在W1
中删除了一个文件,那么该文件必须已被添加(从release
的角度)M1
,因此在将其应用于master
时通常不会有任何净变化。如果master
即使不包含feature
也会搞砸,那么可能需要更多信息来理解为什么(以及如何处理它)。
(或者OTOH,如果feature
已已经在你开始尝试合并release
掌握时间合并master
- 这可以解释为什么合并看起来像一个烂摊子 - 那么这将需要不同的分辨率是什么我以下建议。)
但是,如果当它从问题听起来,你没有尚未合并feature
,那么当你做尝试合并feature
到master
,我希望git的思考A
和B
(最终添加文件)已通过M1
应用。 (W1
随后发生的变化,然后发生撤消它,但git并不在乎)。
我想你需要的是新的承诺,做A
和B
做了什么。你可以通过相对得到,通过将feature
重新编号为M2
(或稍后在master
)稍有头痛。问题是,如果你告诉rebase,master
是你的上游,它将跳过A
和B
(因为那些可从master
到达)。所以你必须强制上游承诺O
。
所以你可以看看了SHA价值O
,或穿上它一个标签(比如feature-root
),然后
git rebase --onto master feature-root feature
产生
A' --- B' --- C' --- D' <--(feature)
/
O --- x --- x --- x --- M2 <--(master)
\ \ /
\ x --- M1 --- W1 <--(release)
\ /
A ----- B --- C --- D
所以C
和D
并不重要(gc
将最终回收它们),A
和B
(和M1
)被遗留在历史中(避免最有问题的逆境并且只有共享feature
ref的用户需要担心上游基准恢复。
感谢您的回复,我已经研究了您所说的内容,并在主要帖子中更好地解释了情况 – gienini