10

我不小心开始在另一个中间开发一个新功能。我的存储库看起来像这样:

A - B - C - D - E master

但我希望让它看起来像这样:

A - B - D - E     master
       \
        C         new-feature

这似乎是一个简单的问题,但我还没有通过搜索找到答案。樱桃采摘似乎接近我想要的,也许还有一些变基,但我是 Git 的新手,希望能得到一些帮助。

4

3 回答 3

9

首先,创建新分支:

git branch new-feature C

接下来,修复master

git checkout master
git rebase -i B

当编辑器出现时,从列表中删除 C。保存并退出。

于 2013-06-18T01:02:22.160 回答
3

我将在这里使用一些非常危险的操作,所以请注意。

这个答案做了几个假设:

  1. 您的最终master分支应如下所示: A - B - D - E

  2. 您的最终new-feature分支应如下所示: A - B - C

  3. 没有提交C不会影响应用提交DE在提交之上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'

于 2013-06-18T01:05:13.873 回答
1

假设您当前在分支上master

  1. git branch new-feature master~2现在分支new-feature已创建并指向 C 提交。(完成后您仍在分支上工作master
  2. git rebase --onto master~3 master~2这会将所有提交从到提交 B(即)master~2的头部移植。mastermaster~3

好的,你完成了!

始终git help <cmd>用于详细信息。

于 2013-06-18T05:19:46.787 回答