Git工作流问题。从另一个分支中删除已合并的分支。

5

我有一个特性分支,在过去的几周内多次与开发分支合并。在我们将其合并到主分支之前,我们想要删除已经合并到开发分支中的特性分支代码。是否有一种统一的方法来实现这个目标?

这些合并是使用--no-ff创建的,因此新分支中的提交应该有自己的对象。

_______ master ______________________________
                  \                   /
                   \                 /
                    \__hofix-1_____C/
                                    \
_ development _______________________\____________
\                    /          /         /
 \                  /          /         /
  \_feature-test__A/_________B/________D/

我想从开发分支中移除合并提交A、B和D,同时仍保留hotfix-1、合并C,并继续在特性分支上工作。

2个回答

4
这个问题有点模糊。你有一个dev分支,并希望取消合并的几个入站合并,留下其余部分?如果是这样,可以使用rebase -i -p以某些低点,从todo列表中删除合并提交。请注意,您应该重新检查您拉取的所有提交,因为下一项工作可能会在其上构建。
另一种方法是在不需要的更改顶部使用git revert。它完成了最终结果,但可能会使您拥有质量较差的历史记录。

你是正确的。这些解决方案中的任何一个会导致其他用户跟踪的分支出现问题吗?也就是说,如果他们尝试合并回开发分支,会引起冲突还是分支会分叉。我认为变基会这样做。 - madphp

1

如果我正确理解了您的情况,我认为您不需要使用像rebase、revert等这样重量级的工具。您可以简单执行以下步骤:

  1. 查看开发日志,找到A合并之前的提交哈希值,并在该位置创建一个名为“new-dev”的新分支:

    git checkout -b new-dev somecommithash

  2. 现在从hotfix-1分支合并C:

    git merge C

...至此,您已完成操作。new-dev分支现在包含了合并了C后的开发内容,不包含A、B和D。

如果您现在想让developer分支指向与new-dev分支相同的位置,只需执行以下简单命令:

git branch -f developer new-dev

但是为了安全起见,在强制将旧的开发者分支移动到新位置之前,您可能希望使用标签或分支标记旧位置。


好的。如果在与特性分支第一次合并之前创建那个新分支,是否可以只挑选我想要保留的提交。我可能只想保留十几个提交。如果这样做更清晰或更快捷,我是否可以撤销我不想要的提交而不是挑选我想要的提交?我想只要历史记录完整且不影响其他开发人员的历史记录,我就不介意挑选。此外,这可能是一个愚蠢的问题,当打标签时,是在挑选之后还是之前打标签呢? - madphp
要明白的两件事情是:1)你总是在添加,而不是减少;2)分支只是指向特定提交的指针。你可以自由地移动指针。因此,“还原”更改实际上只是将指针移回以前的提交。而 cherry-pick 实际上只是将匹配所选提交的新提交添加到新位置。现在标签的目的只是为了维护指向分支以前指向的位置的指针,以防您想再次找到该位置。您最好在 cherry-pick 之前这样做,但这并不重要。 - Magnus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接