假设您具有以下历史记录:
D———G feature1.1
/
...A-B-C-E-F feature1
现在我想将B分成两次提交以得到:
D———G feature1.1
/
...A-B1-B2-C-E-F feature1
您不能只执行git rebase -i ...,然后选择编辑,因为您得到了这个
B-C-D-G feature1.1
/
...A-B1-B2-C'-E'-F' feature1
但是通过在C'C feature1.1上使用git rebase可以快速解决此问题。
现在是一个更具体的用例。如果feature1是您的主分支,A是您的初始提交,并且您想拆分A,那么您将如何处理。相同的技术不起作用,因为在重新设置基准之后,它们不再具有共享的历史记录。
大宗外科手术是git filter-branch
领域,使用最方便的工具来进行任何内容更改。有时,这是在“过滤器分支”摘要中“在您在那里时”最容易执行的操作,但在此可以更轻松地提前设置内容,而仅使用过滤器分支进行祖先重写。您无需重写现有血统就可以做的事情是A---B1---B2
,首先开始做
git checkout B
git reset A
并且您的工作树现在是B
内容,您的索引是A
内容,并且HEAD,即您的下一个提交的父对象是A
,因此添加B1
内容是最方便的:]]
git add files whose changes all belong in B1 git add --patch files whose changes partially belong in B1 git reset --patch any hunks you added by mistake git commit # this makes B1 git add . # everything that remains belongs in B2, so add everything git commit # this makes B2
现在剩下的唯一事情就是重新连接血统,不需要更改任何内容。进行仅本地重新布线,然后使用
git filter-branch
将本地历史重写到依赖于它的所有重写历史中:
git replace --graft C B2
git filter-branch -- --all