我有一个主分支mainline,其中包含提交历史1->2->3->4->5。我使用以下命令从mainline创建了一个本地分支test:
git checkout -b "test"
我在测试分支中进行了一些提交,比如从6->7。
这是从主干的头部映射而来,主干的提交号为5(即5->6->7)。
我想让测试分支从主干的提交号1开始映射头部。(即1->6->7)
如何实现?
我有一个主分支mainline,其中包含提交历史1->2->3->4->5。我使用以下命令从mainline创建了一个本地分支test:
git checkout -b "test"
我在测试分支中进行了一些提交,比如从6->7。
这是从主干的头部映射而来,主干的提交号为5(即5->6->7)。
我想让测试分支从主干的提交号1开始映射头部。(即1->6->7)
如何实现?
rebase --onto
命令来完成此操作。>>> git checkout test
>>> git checkout -b test2 # [optional] in case you have already pushed the test branch to remote, you can use test2 branch instead
>>> git rebase --onto <commit_id_of_1> <commit_id_of_5> <commit_id_of_7>
例子:
>>> git checkout test
>>> git log --oneline
c05a4af commit 7
b0e5f24 commit 6
74c9673 commit 5
...
6712bec commit 1
>>> git rebase --onto 6712be 74c9673 c05a4af
git checkout commit_id_7
git checkout -b repair new_test_branch
git cherry-pick commit_id_6
git cherry-pick commit_id_1
git checkout test
git reset --hard commit_id_7
git merge repair
git push --hard origin test
rebase
和cherry-pick
只应该作为最后的选择,但一定要谨慎使用,因为它们会改变分支的历史记录。但只要你知道自己在做什么,并且不改变公共历史记录,那么使用rebase
和cherry-pick
是完全可以的。 - kowsky