[英]Move top commits of one branch to another
假设我想从
branch1 <- HEAD
↓
A -- B -- C -- D -- E
↑
branch2
至
branch1
↓
A -- B -- C
\-- D' -- E'
↑
branch2 <- HED
当我在本应提交到另一个分支的分支中提交时,可能会发生这种情况。 我还没有推送两个分支,所以我应该将那些D
和E
提交从branch1
移到branch2
。
一种可能是先摘下然后强制将branche1
回去,但这很丑陋:
git checkout branch2
git cherry-pick D E
git branch -f branch1 C
应该有一个变基。
这正是rebase --onto
的目的:您可以在任何提交的基础上重新建立分支。 基本语法为:
git rebase --onto new_base old_base branch
在您的情况下,您必须先将branch2
移动到branch1
:
git checkout branch2
git reset --hard branch1
然后将branch2
移到B
的顶部:
git rebase --onto B C branch2
之后,将branch1
回C
:
git checkout branch1
git reset --hard C
详细的例子:
命令行参数
--onto
可以传递给git rebase。 在git rebase--onto
模式下时,命令扩展为:git rebase --onto
--onto
命令可启用功能更强大的表单或变基,它允许传递特定的引用作为变基的技巧。假设我们有一个带有分支的示例仓库:
o---o---o---o---o master \\ o---o---o---o---o featureA \\ o---o---o featureB
featureB
基于featureA
,但是,我们意识到featureB
不依赖于featureA的任何更改,而可以从master
分支出来。git rebase --onto master featureA featureB
featureA
是<oldbase>
。master
成为<newbase>
而featureB
是<newbase>
HEAD
所指向的参考。 结果为:o---o---o featureB / o---o---o---o---o master \\ o---o---o---o---o featureA
(从Atlassian Git教程中 ,搜索--onto
)
您可以使用交互式rebase: git checkout branch1 git rebase branch2 -i HEAD~2
资料来源: https : //git-scm.com/book/en/v2/Git-Tools-Rewriting-History
然后,按照您想要的顺序提交。 如果要将分支移动到目标,则必须强制它们( git branch -f {branch-name} {postition}
)
首先,请确保您没有未提交的更改。 提交或隐藏它们。
然后创建一个临时分支或一个指向提交E
的标签。 如果出了什么问题,您可以使用它(通过检出并进行硬重置)来恢复branch1
的位置并重新开始。 达到所需的结果后,您可以删除分支或标签。
您可以通过以下方式实现所需的结构:
# Make branch `branch2` point to commit `E`
git checkout branch2
git rebase branch1
# Move `branch1` onto its desired destination (2 commits behind its current position)
git checkout branch1
git reset --hard HEAD~2
# Get back to branch2
git checkout branch2
# Rebase its most recent 2 commits (D and E) on top of B
git rebase --onto HEAD~3 HEAD~2
另外,您也可以将最后一个命令改写为git rebase --onto branch1~1 branch1
。
它移动可从当前分支(指向提交E
branch2
)到达但不能从分支branch1
到达提交branch1~1
( branch1
的父branch1
)顶部的提交。 通过这种方式,启动从历史线branch1
(除branch1
)上移动的兄弟branch1
(或其它地方的说法--onto
说)。
阅读git rebase
文档以获取有关git rebase
如何工作的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.