2017-05-30 195 views
0

因此,我错误地合并了分支release并推送。 然后恢复它,并提交合并提交,并且一直运行良好。Git恢复合并提交,丢失了一些文件

当试图合并releasemaster时,问题出现,注意到一些丢失的文件和奇怪的更改。当我的master分支上发生了错误的合并时,问题变得更加令人恐惧。我回头看看恢复合并提交(W1),我看到所有这些文件在相反文件删除提交时丢失的文件。

牢记的feature分支将是在master反正合并,我对逆向思维上衍合-i从master提交(W1)并继续就这样完成合并无反向承诺。

您是否认为有更好的解决方案?

谢谢大家! :) enter image description here

编辑

首先,感谢您的关注和响应!我在图片上添加了一些内容以更好地解释情况。
实际上我们不再在乎图片中的release分支,它只影响几个文件,并且可以出现在master上,没有任何重大问题。在master之间创建releasefeature之间的文件添加和修改。

我试图重新发布主分支,发布合并后(M2)删除(W1)。我知道我们放弃了一些release的历史,但我认为这是一个更好的解决方案来“保存”实际发布的代码,如果有必要,我们可以从它开始回购。 有1000次提交重投,有些冲突正在播种。我正在纠正与每个文件的最新正确版本的每个明显冲突。

EDIT 2

最后,我们重建基础的master分支,然后在该分支的顶部所施加的差异,像“假底垫”,这样的变化是显而易见的和可变的。

回答

1

UPDATE:根据您的更新问题

,我明白为什么文件缺失发生。这对我来说似乎是一种不寻常的情况组合。最有趣的一点是,合并的恢复比初看起来更加危险。撤销合并(通过重置清除历史记录之前将其从历史记录中清除)是典型的过程,并且可以避免这种问题 - 如果问题在推送之前被捕获。但这在这里和现在没有太大的帮助。

虽然有所澄清,但我仍建议您不要对您提出的历史编辑进行修改,并且我所有关于该修改的建议都包含在我的原始答案中。请记住,如果您通过修改release提交,release将仍然具有原始提交,并且您将有一个奇怪的,分裂的历史记录容易在某些合并操作中发生冲突(因为重复的提交执行相同的操作) 。

如果您想将M1的所有更改恢复到历史记录中,可以通过回复W1来减少头痛。你仍然可能会遇到一些冲突,但是从一开始就简单得多。不会造成上游发生重组问题;并且让您在路上看到更少的冲突合并。


这听起来像你正在考虑编辑发布分支的历史。为了短期的原因(需要“上游调整”resoultion)和长期原因(发布部门不再记录发布的内容),我建议不要这样做。当然,我可能误会你提出什么,让我们得到一个共同的出发点:

您目前有类似

O --- x --- x --- x --- M2 <--(master) 
\  \    /
    \  x --- M1 --- W1 <--(release) 
    \  /
    A ----- B --- C --- D <--(feature) 

其中M1是的feature一个错误的合并成releaseW1恢复M1M2release最终合并为master

据我所知,所有这一切都被推动,其中一些反映在您的发布版本的历史中,并且“问题”提交也已经是master的共享历史的一部分。所以如果是我,我会认为几乎所有这些都是“石头写的”。

如果你最终决定使用变基“修理”的发布分支,两件事情要考虑:

1)这将是最好的发布分支历史删除M1W1,使至少它的结果树是你发布的东西的正确反映。 (我认识到,最终从M1工作将被重新推出,但是这不是你发布的内容。)

2)做到了这一点,你不得不重做M2合并使用新release(创建M2') ref,然后rebasease master,以及从master分支的所有其他从M2M2'的分支。如果这是一个积极的回购,它可以迅速蜘蛛网。

这就是为什么我不会。那么你还能做什么?

这听起来像release出来看,因为它应该,所以这是我不清楚为什么这会对master任何不良影响,直到您尝试合并feature。毕竟,如果在W1中删除了一个文件,那么该文件必须已被添加(从release的角度)M1,因此在将其应用于master时通常不会有任何净变化。如果master即使不包含feature也会搞砸,那么可能需要更多信息来理解为什么(以及如何处理它)。

(或者OTOH,如果feature已经在你开始尝试合并release掌握时间合并master - 这可以解释为什么合并看起来像一个烂摊子 - 那么这将需要不同的分辨率是什么我以下建议。)

但是,如果当它从问题听起来,你没有尚未合并feature,那么当你尝试合并featuremaster,我希望git的思考AB (最终添加文件)已通过M1应用。 (W1随后发生的变化,然后发生撤消它,但git并不在乎)。

我想你需要的是新的承诺,做AB做了什么。你可以通过相对得到,通过将feature重新编号为M2(或稍后在master)稍有头痛。问题是,如果你告诉rebase,master是你的上游,它将跳过AB(因为那些可从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 

所以CD并不重要(gc将最终回收它们),AB(和M1)被遗留在历史中(避免最有问题的逆境并且只有共享feature ref的用户需要担心上游基准恢复。

+0

感谢您的回复,我已经研究了您所说的内容,并在主要帖子中更好地解释了情况 – gienini