我有分支机构
B1 --c01--c02--c03--c04
B2 --c11--c12--c13--c14
我用 B1 重新设置了 B2 分支,所以
B2 --c01--c02--c03--c04--c11--c12--c13--c14
两个分支同时发展,现在 B1 发生了巨大的变化,必须重新定位到 B2
所以,我需要删除所有旧 --c01--c02--c03--c04
数据并用新数据替换它们!
谁能帮我怎么做?
我有分支机构
B1 --c01--c02--c03--c04
B2 --c11--c12--c13--c14
我用 B1 重新设置了 B2 分支,所以
B2 --c01--c02--c03--c04--c11--c12--c13--c14
两个分支同时发展,现在 B1 发生了巨大的变化,必须重新定位到 B2
所以,我需要删除所有旧 --c01--c02--c03--c04
数据并用新数据替换它们!
谁能帮我怎么做?
通常,历史不应该改变。不断变化的历史使合作变得比它可能而且应该变得更加复杂。
但是鉴于历史已经改变,并且您想在重写的分支之上重放一堆提交,您可以使用git rebase
以下--onto
选项:
git rebase --onto new-c04 old-c04 B2
# or: git rebase --onto new-c04 c11^ B2
上面的命令将获取old-c04
(不包括)和分支尖端B2
(包括)之间的所有提交,并将它们重播到 commit 上new-c04
。它还将B2
分支指针移动到新历史的新提示(包括您的提交)。
您可能想研究一个补丁队列系统,例如 guilt 或 TopGit。
如果您以与远程不一致的方式在本地修改 B2,那么您可以做很多事情。一种方法是:
git checkout B2 # make sure
git branch broken # create a branch to remember this point
git reset --hard @{u} # reset everything on B2 back to the position on the remote head
git pull --rebase # B2 will now be as the remote
我假设当您说 --c01--c02--c03--c04 需要替换为来自远程仓库的其他提交时。所以 B2 剩下的就是将 c11--c12--c13--c14 重播到分支上。您可以挑选或重新调整这些更改:
git rev-list broken~4..broken | git cherry-pick --stdin
如果 B1 是远程分支,也需要重置 B1。