从Git中的单个分支中删除提交

时间:2011-08-31 15:31:41

标签: git branch

我有两个分支,master和feature1。当我意识到我需要处理其他不相关的东西时,我正在研究feature1。不幸的是,我忘了从master分支,而是从feature1创建了我的feature2分支。现在我想将feature2合并到master中,但不能,因为该分支中有feature1的部分内容。

如何从feature2分支中删除feature1提交?是否涉及变基?

我觉得如果我可以将feature2的起始参考点更改为master的位置,那可能有所帮助,但不知道如何。

编辑:

谢谢你的答案!我根据@ Mark的解决方案尝试了变基础,但意识到历史比我原先想象的要复杂得多。功能2已合并到其他功能分支中,并且master已在一个点合并到feature2中。还有一些主要的提交与feature2无关。一切仍然是本地的。

真的,我的历史更像是这样:

A - B - C - D - - - - - - - - - - - - - L - M  master  
            |                          
            |               - I - J - K  feature2                  
            \              /           \
             - E - F - G - H - - - - - -N - O - P  feature1

我想要的是这个:

A - B - C - D - - - - - - - - - -  L - M  master
            |\                          
            |  - - - - - I - J - K  feature2                  
            \                     \
              - E - F - G - H - - - N - O - P  feature1

我也尝试过:

git rebase --onto 1524b824cfce5856a49e feature1 feature2
// 1524b824cfce5856a49e == D

但这只是将分支名称功能2设置为1524,并将I,J,K与其原始父项一起提交。

2 个答案:

答案 0 :(得分:29)

如果只是你在你的feature2分支上工作而你没有与其他人分享,那么在合并之前重新定义该分支是没关系的。您可以执行以下操作,例如:

git checkout feature2
git rebase --onto master feature1 feature2

...将重写您的feature2分支,将其保留为feature2中的所有提交,因为它从feature1分支,但重新应用到{{1} }}。我建议您之后使用master或类似的git历史记录查看器来检查此操作的结果是否符合您的要求。

顺便说一下,这正是用于解释git rebase documentationgitk --all的情景 - 请参见开头的段落:

  

以下是如何使用rebase --onto将基于一个分支的主题分支移植到另一个分支,假装您从后一个分支分叉主题分支。   [...]


针对问题中的更多内容进行了更新:

从您的历史开始,如下所示:

--onto

通过执行以下操作,您可以获得所需内容:

A - B - C - D - - - - - - - - - - - - - L - M  master  
            |                          
            |               - I - J - K  feature2                  
            \              /           \
             - E - F - G - H - - - - - -N - O - P  feature1

这将为您留下如下历史记录:

git checkout feature2
git rebase --onto D H feature2

A - B - C - D - - - - - - - - - - - - - - - - - - - L - M master |\ | \ - I' J' K' feature2 I - J - K \ / \ - - - - - - - E - F - G - H - - - - - -N - O - P feature1 中创建所需的合并之前,您应该记下feature1O的SHA1sum。 (我假设P只是一个正常的合并,而不是“邪恶合并”。)

然后执行硬重置以将feature1移回N

H

然后你应该有历史:

git checkout feature1
git rest --hard H

现在您显然希望将A - B - C - D - - - - - - - - - - - - - - - - - - - L - M master |\ | \ - I' J' K' feature2 \ - - - - - - - E - F - G - H feature1 合并到K'

feature1

最后,您可以将旧的git merge K' A - B - C - D - - - - - - - - - - - - - - - - - - - L - M master |\ | \ - I' - J' - - - - - - - K' feature2 \ \ - - - - - - - E - F - G - H - Z feature1 O挑选到P上:

feature1

......离开:

git cherry-pick O
git cherry-pick P

答案 1 :(得分:2)

如果您不介意将 feature2 重新合并到P而不是M,则这是一个相对简单的解决方案。

  1. Rebase I-J-K到D,查看章节标题“更有趣的rebases
  2. 将O-P重新安装到H. 与步骤1相同
  3. 最终将功能2与git merge feature2合并到 feature1 ,同时检出 feature1
  4. 如果您希望K合并到特定提交中,则变基会变得有点棘手。