我有两个分支,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与其原始父项一起提交。
答案 0 :(得分:29)
如果只是你在你的feature2
分支上工作而你没有与其他人分享,那么在合并之前重新定义该分支是没关系的。您可以执行以下操作,例如:
git checkout feature2
git rebase --onto master feature1 feature2
...将重写您的feature2
分支,将其保留为feature2
中的所有提交,因为它从feature1
分支,但重新应用到{{1} }}。我建议您之后使用master
或类似的git历史记录查看器来检查此操作的结果是否符合您的要求。
顺便说一下,这正是用于解释git rebase
documentation中gitk --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
中创建所需的合并之前,您应该记下feature1
和O
的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
,则这是一个相对简单的解决方案。
git merge feature2
合并到 feature1 ,同时检出 feature1 。如果您希望K
合并到特定提交中,则变基会变得有点棘手。