从现有提交创建新分支

时间:2016-04-26 11:33:25

标签: git branch rebase

我有以下情况:

(M1)---(M2)---(M3)---(M4) (master)
  \
   \
   (A)---(B)---(C)---(D) (feature)

我从master分支并开始开发一个新功能,我在B停止了。然后我开始研究一项新功能,我提交了CD。自A以来我没有推过任何东西。

但是,哎呀,我忘了为第二个功能从master创建一个新的分支!我现在需要推出第二个功能,但第一个功能还没有完成。由于它都在同一个分支上,我无法推动,否则未完成的第一个功能将随之而来。所以我认为我需要达到这样的目的:

   (A)---(B) (unfinished feature)
   /
  /
(M1)---(M2)---(M3)---(M4) (master)
  \
   \
   (C)---(D) (finished feature)

通过一些研究,我发现了以下内容:git rebase --onto M1 C。我不认为这是对的,因为我希望C之后的所有内容都成为M1的新分支,而不是在{C上重播Dmaster 1}}。我想保持master并保持第一个功能不变,只需为第二个功能创建一个新分支。

在这里做什么是正确的,甚至可能吗?

编辑: 哎呀,我的结构错了。我实际上为第二个功能创建了一个分支,但是我创建了第一个功能而不是主功能。所以它看起来像:

(M1)---(M2)---(M3)---(M4) (master)
  \
   \
   (A)---(B)    (feature 1)
     \
      \
      (C)---(D)  (feature 2))

我希望feature 2独立于feature 1,因此不包括提交A

2 个答案:

答案 0 :(得分:0)

  

但是,哎呀,我忘了为大师创建第二个功能的新分支!我现在需要推送第二个功能

没问题,现在创建分支,您的工作目录和分段将使用新代码。

提交并保存您的工作。现在你可以回到原来的分支并在那里完成你的工作,当你完成并想要导入你的更改时,使用git-cherry-pick将你的提交导入到新的分支。

git cherry-pick <SHA-1>

  

在主分支的顶端应用commit(s)引入的更改,并使用此更改创建新的提交。

...的语法是提交范围。从开始(排除)到最后一个提取所有提交。如果您想要单个提交,请使用单个SHA-1

enter image description here

宣读完整的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

https://git-scm.com/docs/git-rebase