无论后来推送其他分支,都从主服务器回滚旧分支

时间:2016-08-31 09:27:34

标签: git gitlab

第一种情况:

我有3个分支机构。分支A,分支B,分支C.

我开发,测试并合并/推动分支A到掌握。我删除了分支A,因为它已合并为master。

一周后,分支B和C进行测试并推送到掌握。我删除B和C,因为它们已合并为主。

另一周后,老板来到办公室说“A是个坏主意,我想删除它。” 显然,他想要删除A,但希望将B和C保留在制作中。

我该怎么做?在这种情况下,A与B和C完全独立。

第二种情况:

此方案与第一个方案相同,但A和A合并为主时,B和C重新为主。 因此,他们收到了可用的新方法,并使用了它们。

现在我想知道,我们如何在不破坏B和C的情况下“删除”A?

对我来说,答案是“测试会告诉我哪里错了”,但我们没有测试。

感谢。

3 个答案:

答案 0 :(得分:1)

对于第一个场景:找到分支A的合并提交的哈希并执行

git revert <hash>

如果将A合并到主服务器中,第二个方案应该相同,因为合并提交的恢复将撤消更改,并且将B和C合并到主服务器没有再次引入更改

但是,您也可以通过对每个哈希值执行git revert来撤消分支A中的每个提交。编辑:请记住以相反的顺序恢复单个提交,即从最新的开始。

答案 1 :(得分:1)

因为你的老板想要从master分支中完全删除A中引入的更改,所以你应该能够在{{1}中简单地恢复A合并提交。 }}。使用master将引入一个新的提交,它有效地撤消了原始提交引入的所有内容。

git revert

答案 2 :(得分:1)

正如其他答案所述,第一种情况可以通过git revert -m 1 <hash-of-merge>来解决。 &#34; -m 1&#34;告诉git哪个合并提交的父项是主线,不应该还原。您可以使用git show <hash-of-merge>查看父母,它会为您提供类似&#34; Merge:&#34;的输出。如果您想保留其所有父母的更改,请使用&#34; -m 1&#34;。

这将导致一个新的提交,它简单地撤消分支A所做的所有更改。

另一种方法是将git rebase--preserve-merges选项一起使用,这样您就可以重写历史记录并删除该合并。然而,这会改变你的历史,如果那个分支已被其他人使用(这很可能是你的主人),这不是一个好主意。

关于第二种情况,我非常确定如果没有一些手动工作,它将无法实现。在每种情况下删除A将删除该分支引入的函数,如果它们依赖于这些函数,它将破坏B和C的更改。因此,您可以手动从A中删除该功能,保留所有仍然需要的功能。或者如上所述进行A的还原,然后再次手动添加这些功能。哪个选项更好取决于应该删除多少分支A以及应该保留多少。