Git还原合并提交,丢失了一些文件

时间:2017-05-30 15:24:33

标签: git merge

所以我在feature上错误地合并了我的release分支并推送了。 然后通过反向提交合并提交将其还原,并且顺利进行。

尝试将release合并到master时出现问题,注意到一些丢失的文件和奇怪的更改。当我的master分支上实际推送了损坏的合并时,问题变得更加恐慌

回顾一下revert merge commit (W1),我看到所有那些丢失的文件都在反向提交中删除文件。

请记住,feature上的master分支仍会合并,我正在考虑反向提交master(W1)的rebase -i就像没有反向提交就完成合并一样。

你认为有更好的解决方案吗?

谢谢大家! :) enter image description here

修改

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

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

编辑2

最后,我们重新设定master分支,然后在分支顶部应用差异,就像“假的变基”一样,这样变化是可见的和可变的。

1 个答案:

答案 0 :(得分:1)

更新

根据您更新的问题,我知道文件删除的原因。对我来说,这似乎是一种不寻常的情况组合。最有意思的一点是,合并的恢复比初看起来更危险。撤消合并(通过重置以在其被推送之前将其从历史记录中清除)是典型的过程并且将避免这种问题 - 如果在推送之前捕获了问题。但这在现在和现在都没什么帮助。

尽管有澄清,但我仍然建议您反对您提出的历史编辑,并且我对该编辑的所有建议都包含在我的原始答案中。请注意,如果您以master编辑提交的方式重新定位releaserelease仍将拥有原始提交,并且您将遇到一个奇怪的,分裂的历史,在某些情况下会发生冲突合并操作(因为重复提交做同样的事情)。

如果您想将M1中的所有更改重新放入历史记录中,您可以通过还原W1来减少麻烦。你仍然可能会遇到一些冲突,但这是一个更简单的程序;不会产生上游的rebase问题;并向您展示更少的冲突合并。

听起来您正在考虑编辑发布分支的历史记录。我建议不要出于短期原因("上游rebase"将需要的重新生成)和长期原因(发布分支将不再记录发布的内容)。当然,我可能误解了你提出的建议,所以让我们找到一个共同的起点:

您目前有类似

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

其中M1featurerelease的错误合并,W1还原M1,而M2release的最终合并{1}} master

据我所知,所有这些都被推动了,其中一些反映在你的发布版本的历史中,以及&#34;问题&#34;提交也已成为master共享历史记录的一部分。所以,如果是我,我会考虑几乎所有这些内容,而且是用石头写的#34;

如果你最终决定使用rebase来修复&#34;发布分支,需要考虑两件事:

1)最好从发布分支历史记录中删除M1 W1,这样至少其结果树可以正确反映您发布的内容。 (我意识到最终将重新引入M1的作品,但这不是你发布的。)

2)完成此操作后,您必须使用新的M2引用重做M2'合并(创建release),然后重新定位master ,以及从master以来M2分支到M2'的任何其他内容。如果这是一个活跃的回购,它可以快速蜘蛛网。

这就是为什么我不会这样做的原因。那你还能做什么呢?

听起来release看起来应该是这样,所以我不清楚为什么这会对master 造成任何不良影响,直到你尝试合并为止feature 的。毕竟,如果在W1中删除了文件,则必须在release之前添加该文件(从M1的角度来看),因此通常不会将此应用于master时的净变化。如果master虽然不包含feature,但如果它被搞砸了,可能需要更多信息来了解原因(以及如何处理)。

(或OTOH,如果feature 已经已经在您开始尝试将master合并到母版时已合并到release,这可以解释原因合并看起来像一团糟 - 然后需要一个不同于我在下面建议的解决方案。)

但是,如果从问题中发现,您尚未尚未合并feature,那么当您时尝试合并{{ 1}}到feature,我希望git认为masterA(最终添加了文件)已经通过B应用了。 (然后M1的后续更改会将其撤消,但git并不在意。)

我猜您需要的是执行W1A所做的新提交。您可以通过将B重新定位到feature(或稍后M2)来解决相对小问题。问题是如果你告诉rebase master是你的上游,它会跳过masterA(因为那些可以从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最终会收回它们),gcA(和{{1}在历史记录中保留单独的(避免最有问题的上游rebase),只有共享B ref的用户需要担心上游rebase恢复。