我有以下情况:
(M1)---(M2)---(M3)---(M4) (master)
\
\
(A)---(B)---(C)---(D) (feature)
我从master
分支并开始开发一个新功能,我在B
停止了。然后我开始研究一项新功能,我提交了C
和D
。自A
以来我没有推过任何东西。
但是,哎呀,我忘了为第二个功能从master
创建一个新的分支!我现在需要推出第二个功能,但第一个功能还没有完成。由于它都在同一个分支上,我无法推动,否则未完成的第一个功能将随之而来。所以我认为我需要达到这样的目的:
(A)---(B) (unfinished feature)
/
/
(M1)---(M2)---(M3)---(M4) (master)
\
\
(C)---(D) (finished feature)
通过一些研究,我发现了以下内容:git rebase --onto M1 C
。我不认为这是对的,因为我希望C
之后的所有内容都成为M1
的新分支,而不是在{C
上重播D
和master
1}}。我想保持master
并保持第一个功能不变,只需为第二个功能创建一个新分支。
在这里做什么是正确的,甚至可能吗?
编辑: 哎呀,我的结构错了。我实际上为第二个功能创建了一个分支,但是我创建了第一个功能而不是主功能。所以它看起来像:
(M1)---(M2)---(M3)---(M4) (master)
\
\
(A)---(B) (feature 1)
\
\
(C)---(D) (feature 2))
我希望feature 2
独立于feature 1
,因此不包括提交A
。
答案 0 :(得分:0)
但是,哎呀,我忘了为大师创建第二个功能的新分支!我现在需要推送第二个功能
没问题,现在创建分支,您的工作目录和分段将使用新代码。
提交并保存您的工作。现在你可以回到原来的分支并在那里完成你的工作,当你完成并想要导入你的更改时,使用git-cherry-pick将你的提交导入到新的分支。
git cherry-pick <SHA-1>
在主分支的顶端应用commit(s)引入的更改,并使用此更改创建新的提交。
...
的语法是提交范围。从开始(排除)到最后一个提取所有提交。如果您想要单个提交,请使用单个SHA-1
宣读完整的git cherry-pick
documentation for all the options you can use
答案 1 :(得分:0)
在这种情况下,只有少量提交,git cherry-pick
为@CodeWizard建议,是最简单的方法。但是如果你有更多的提交,那可能不太实际。这是使用git rebase --onto
的解决方案。
# create feature2 and rebase it onto A
git checkout -b feature2 D
git rebase --onto A B feature2
# move the feature branch to be just on B
git checkout feature
git reset --hard B