我很好奇您所说的“在主要分支中没有意义”是什么意思。您是否担心该功能将在主要分支上恢复?或者您只是对标题为“恢复功能”之类的提交感到恼火,而实际上该功能存在于主要分支的历史记录中?
如果没有更多细节,很难说合并的结果是什么,但这里有一些可能性:
如果您的历史记录如下所示:
* (major)
| * (minor)
* |
| * revert feature on minor
* | cherry-pick feature onto major
| * add feature to minor
* |
|/
* common ancestor
|
然后你可以简单地合并minor
到major
没有任何问题。
为什么?可以这样想:当您合并minor
到major
时,您实际上是在获取共同祖先 ( git merge-base major minor
) 和之间的差异minor
,将其作为补丁应用到 上major
,然后创建一个恰好同时具有major
和minor
作为父级的提交。
共同祖先之间的差异minor
不会包含任何添加然后恢复的功能的提示,因为这两个提交相互抵消。因此,唯一会引入的更改将major
是由minor
.
如果您的历史记录如下所示:
* (major)
| * (minor)
* |
| * revert feature on minor
* | merge minor into major
|\|
* | cherry-pick feature onto major
| * add feature to minor
* |
|/
*
|
那你就有问题了。major
在这种情况下,和之间的共同祖先minor
是标记为“ add feature to minor
”的提交。如果您查看这个共同祖先 和 之间minor
的差异,差异将包括该功能的恢复。当您合并minor
到major
时,此差异将应用于major
,恢复该功能major
。
在这种情况下,有几种简单的方法可以避免丢失功能major
:
合并minor
到major
中,然后还原还原。生成的图表如下所示:
* revert the revert (major)
|
* merge minor into major
|\
* |
| * (minor)
* |
| * revert feature on minor
* | merge minor into major
|\|
* | cherry-pick feature onto major
| * add feature to minor
* |
|/
*
|
创建一个新的分支minor
。让我们称之为minor-for-merge
。在此分支上,还原还原。然后将分支合并到major
并删除分支。生成的图表如下所示:
* merge minor-for-merge into major (major)
|\
| * revert the revert
* \
| * (minor)
* |
| * revert feature on minor
* | merge minor into major
|\_ |
* \| cherry-pick feature onto major
| * add feature to minor
* _/
|/
*
|
无论哪种方式都有效。后者有点尴尬 - 恢复恢复的提交有点悬在无人区 - 但它可以帮助您在合并到时避免大量合并冲突major
。
无论您采用哪种方式,任何分支minor
都可以合并到,major
而无需恢复该功能。如果在还原之前进行了分支minor
,则还原将不会出现在被合并的历史记录中。如果分支minor
是在还原之后进行的(或者如果在还原minor
之后合并到分支中),则revert 仍然不会出现在被合并的历史记录中,因为该提交已经在major
的祖先中。