我不小心开始在另一个中间开发一个新功能。我的存储库看起来像这样:
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-feature
commit 将从 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
的头部移植。master
master~3
好的,你完成了!
始终git help <cmd>
用于详细信息。