我在处理一个功能时不慎开始了另一个功能的开发。我的代码仓库现在看起来是这样的:
A - B - C - D - E master
但是我希望它看起来像这样:
A - B - D - E master
\
C new-feature
这似乎是一个简单的问题,但我搜索过后还没有找到答案。看起来像是需要挑选某些提交记录,或者进行一些变基操作,但我对Git还不够熟悉,希望能得到一些帮助。
首先,创建新分支:
git branch new-feature C
git checkout master
git rebase -i 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'
也是一样的。new-feature
分支上的提交C
要从提交B
分支上分离出来。找到提交B
的SHA1值,然后执行以下操作(省略下面的尖括号):
git checkout -b new-feature <提交B的SHA1值>
这将创建一个名为new-feature
的分支,该分支以提交B
为起点,并为您签出它。现在我们在new-feature
分支上,并且它看起来像这样:
A - B
最后一步是找到提交C
的SHA1值。我们可以在backup
分支中找到它。使用git log backup
(或其他方法)查找备份分支上提交C
的SHA1值。之后,在new-feature
分支上执行以下操作:
git cherry-pick <提交C的SHA1值>
当然,请省略尖括号。new-feature
分支应该看起来像:
A - B - C'
C
的父级已经是B
。如果您在变基之前只需创建该分支,则无需进行任何高超操作。 - Carl Norummaster
上。
git branch new-feature master~2
现在创建了一个名为new-feature
的分支,它指向C提交。(完成后仍在master
分支上工作)git rebase --onto master~3 master~2
这将把从master~2
到master
头部的所有提交移植到B提交上(即master~3
)。好了,你完成了!
始终使用git help <cmd>
获取详细信息。
master
分支中删除了(现在只能从new-feature
分支访问C)。据我理解,git rebase --onto
是解决您问题的最佳方法。 - Frank Wu
git push
将拒绝推送主分支。我已经使用了git push origin +master
来完成推送,但我不确定这是否是正确的选择。 - Guss