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