繁体   English   中英

将一个分支的最高提交移至另一分支

[英]Move top commits of one branch to another

假设我想从

                    branch1 <- HEAD
                    ↓
A -- B -- C -- D -- E
     ↑
     branch2

          branch1
          ↓
A -- B -- C
      \-- D' -- E'
                ↑
                branch2 <- HED

当我在本应提交到另一个分支的分支中提交时,可能会发生这种情况。 我还没有推送两个分支,所以我应该将那些DE提交从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

之后,将branch1C

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~1branch1的父branch1 )顶部的提交。 通过这种方式,启动从历史线branch1 (除branch1 )上移动的兄弟branch1 (或其它地方的说法--onto说)。

阅读git rebase文档以获取有关git rebase如何工作的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM