所以我在feature
上错误地合并了我的release
分支并推送了。
然后通过反向提交合并提交将其还原,并且顺利进行。
尝试将release
合并到master
时出现问题,注意到一些丢失的文件和奇怪的更改。当我的master
分支上实际推送了损坏的合并时,问题变得更加恐慌
回顾一下revert merge commit (W1)
,我看到所有那些丢失的文件都在反向提交中删除文件。
请记住,feature
上的master
分支仍会合并,我正在考虑反向提交master
上(W1)
的rebase -i就像没有反向提交就完成合并一样。
你认为有更好的解决方案吗?
首先,感谢您的关注和回应!我在图片上添加了一些内容,以便更好地解释这种情况
实际上我们不再关心图片中的release
分支,它只会影响一些文件并且可以出现在master
上而没有任何重大问题。文件添加和修改master
在创建release
和feature
之间的位置。
在发布合并(M2)
删除(W1)
之后,我正在试图重新绑定主分支。我知道我们正在丢失一些release
历史记录,但我认为这是“保存”实际发布的代码的更好解决方案,如果有必要,我们可以从它开始回购。
有大约1000个提交改变,一些冲突正在播种。我正在用每个文件的最新正确版本纠正每一个明显的冲突。
最后,我们重新设定master
分支,然后在分支顶部应用差异,就像“假的变基”一样,这样变化是可见的和可变的。
答案 0 :(得分:1)
更新:
根据您更新的问题,我知道文件删除的原因。对我来说,这似乎是一种不寻常的情况组合。最有意思的一点是,合并的恢复比初看起来更危险。撤消合并(通过重置以在其被推送之前将其从历史记录中清除)是典型的过程并且将避免这种问题 - 如果在推送之前捕获了问题。但这在现在和现在都没什么帮助。
尽管有澄清,但我仍然建议您反对您提出的历史编辑,并且我对该编辑的所有建议都包含在我的原始答案中。请注意,如果您以master
编辑提交的方式重新定位release
,release
仍将拥有原始提交,并且您将遇到一个奇怪的,分裂的历史,在某些情况下会发生冲突合并操作(因为重复提交做同样的事情)。
如果您想将M1中的所有更改重新放入历史记录中,您可以通过还原W1来减少麻烦。你仍然可能会遇到一些冲突,但这是一个更简单的程序;不会产生上游的rebase问题;并向您展示更少的冲突合并。
听起来您正在考虑编辑发布分支的历史记录。我建议不要出于短期原因("上游rebase"将需要的重新生成)和长期原因(发布分支将不再记录发布的内容)。当然,我可能误解了你提出的建议,所以让我们找到一个共同的起点:
您目前有类似
的内容O --- x --- x --- x --- M2 <--(master)
\ \ /
\ x --- M1 --- W1 <--(release)
\ /
A ----- B --- C --- D <--(feature)
其中M1
是feature
与release
的错误合并,W1
还原M1
,而M2
是release
的最终合并{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认为master
和A
(最终添加了文件)已经通过B
应用了。 (然后M1
的后续更改会将其撤消,但git并不在意。)
我猜您需要的是执行W1
和A
所做的新提交。您可以通过将B
重新定位到feature
(或稍后M2
)来解决相对小问题。问题是如果你告诉rebase master
是你的上游,它会跳过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
(和{{1}在历史记录中保留单独的(避免最有问题的上游rebase),只有共享B
ref的用户需要担心上游rebase恢复。