我不小心开始在另一个中间开发新功能。我的存储库看起来像这样:
A - B - C - D - E master
但我希望看起来像这样:
A - B - D - E master
\
C new-feature
这似乎是一个简单的问题,但我还没有通过搜索找到答案。樱桃采摘似乎接近我想要的东西,也可能是一些变相,但我是Git的新手并且会得到一些帮助。
答案 0 :(得分:6)
首先,制作新分支:
git branch new-feature C
接下来,修复主人
git checkout master
git rebase -i B
当编辑器出现时,从列表中删除C.保存并退出。
答案 1 :(得分:3)
我将在这里使用一些非常危险的操作,所以请注意。
这个答案有几个假设:
您的最终master
分支应如下所示:
A - B - D - E
您的最终new-feature
分支应如下所示:
A - B - C
缺少提交C
不会影响在提交D
之上应用提交E
和B
。
如果情况并非如此,请在此处更新。
首先,在主分支上,我们创建一个新分支作为备份。我们称之为“备份”。
git branch backup
这是为了让我们能够轻松恢复主分支,以防以后出现任何问题。当然我们可以使用git reflog
,但这更方便。
接下来,在主分支上,执行:
git rebase -i HEAD~3
这应启动git rebase
的文本编辑器(交互模式)。找到提交C
的行并将其删除。
现在,您的主分支应该如下所示:
A - B - D' - E'
不要担心我写A - B - D' - E'
而不是A - B - D - E
。 D
和D'
在变更集方面基本相同。 E
和E'
相同。
我们到了那里。我假设C
分支上的提交new-feature
将从提交B
分支出来。找到提交{1}}的提交SHA1,然后(省略下面的尖括号):
B
这将创建一个名为git checkout -b new-feature <SHA1 of commit B>
的分支,它从提交new-feature
开始,并为您检查。现在我们在B
分支上,它看起来像这样:
new-feature
最后一步是找出commit A - B
的提交SHA1。我们在C
分支中有它。
使用backup
(或其他一些方法),在备份分支上找到commit git log backup
的提交SHA1。之后,在C
分支上,执行:
new-feature
当然,请省略尖括号。
现在,git cherry-pick <SHA1 of commit C>
分支应如下所示:
new-feature
答案 2 :(得分:1)
假设您当前在分行master
git branch new-feature master~2
现在创建分支new-feature
并指向C提交。 (完成后,您仍在处理分支master
)git rebase --onto master~3 master~2
这会将master~2
的所有提交移至提交B的头部master
(即master~3
)。好的,你已经完成了!
始终使用git help <cmd>
了解详情。