将Git新分支的源更改为源分支的较旧提交

4

我有一个主分支mainline,其中包含提交历史1->2->3->4->5。我使用以下命令从mainline创建了一个本地分支test:

git checkout -b "test"

我在测试分支中进行了一些提交,比如从6->7。

这是从主干的头部映射而来,主干的提交号为5(即5->6->7)。

我想让测试分支从主干的提交号1开始映射头部。(即1->6->7)

如何实现?


你想从测试分支中删除提交2->3->4->5吗? - Surajano
是的,我不想在测试分支中使用提交2->3->4->5。 - Rohit Mishra
然后,您将在1的顶部重新定位6-7(您的分支)。 - Lasse V. Karlsen
是的 @LasseV.Karlsen - Rohit Mishra
2个回答

2
您可以使用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

rebase文档


虽然如果你已经推送到远程,这可能会帮助你,但我建议你不要进行变基操作。 - kuskmen
他可以在那种情况下创建一个新的分支,这不是什么大问题。 - hspandher
我进行了一次变基操作,它创建了一个新的分支(HEAD 从 8904539 分离)。 - Rohit Mishra
你在哪个分支上进行了rebase操作? - hspandher
git 分支
  • (HEAD 从 8904539 分离) 主线 测试
- Rohit Mishra
显示剩余3条评论

1
使用 Cherry Pick
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

注意:Git rebase和cherrypick是危险但强大的解决方案,应该只在最后一种选择时使用。

1
我不会说rebasecherry-pick只应该作为最后的选择,但一定要谨慎使用,因为它们会改变分支的历史记录。但只要你知道自己在做什么,并且不改变公共历史记录,那么使用rebasecherry-pick是完全可以的。 - kowsky
@kowsky:完全同意,但预防胜于治疗:P - Surajano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接