微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将分支加入新的主提交而不合并?

如何解决将分支加入新的主提交而不合并?

我有 2 个分支:mastermybranch mybranch 基于旧的 master 提交,我希望移动到新的 master 提交而不合并到 master

层次树目前看起来像这样:

master[commit1]---[commit2]---[commit3]---[commit4]
          |
          |
       mybranch[commit1]---[commit2]

我希望它是这样的:

master[commit1]---[commit2]---[commit3]---[commit4]
          |                                   |
          |                                   |
       mybranch[commit1]---[commit2]       mybranch[commit3]---[commit4]

这是 Sourcetree 的截图:

enter image description here

解决方法

在尝试理解和操作 git 分支树时,重要的是要知道分支是指向特定谱系中最近提交的指针,并且历史可以回溯 从那里。较旧的提交不“属于”特定分支,它们只是在其历史记录中可访问。

所以你的实际树看起来像这样(我已经将你称为 commit1 的两个提交重命名为 commit_1commit_b1;这是 git commits 被哈希引用的原因之一,而不是连续的 ID!):

           +---[commit_2]---[commit_3]---[commit_4] <-- master
           |
[commit_1]-+
           |
           +-- [commit_b1]---[commit_b2] <-- mybranch

如果你以同样的方式重绘你要求的树,它会是这样的:

                                           master
                                             |
                                             v
           +---[commit_2]---[commit_3]---[commit_4]---[commit_b3]---[commit_b4] <-- mybranch
           |
[commit_1]-+
           |
           +-- [commit_b1]---[commit_b2] <-- ???

一方面提交 b1 和 b2 之间没有关系,另一方面提交 b3 和 b4。分支指针“mybranch”不能同时指向它们,除非它指向一个将它们合并在一起的新提交。

然而,这可能正是您想要的:您谈论的是“移动”分支,即 what git rebase does。更准确地说,它复制提交,创建看起来像它们的新提交,因此提交 b3 将是 b1 的副本,而 b4 将是 b2 的副本。 (原来的 b1 和 b2 提交,现在任何分支指针都无法访问,最终将被垃圾收集。)

最明确的 git rebase 形式要求您指定历史记录中的三个点 - 通常是分支名称,但可以是任何标识特定提交的内容:

git rebase --onto <new-parent> <old-parent> <branch>

这意味着“获取从 <old-parent> 到并包括 <branch> 的当前提示的所有提交,在 <new-parent> 之上重新创建它们,并将 <branch> 指向这些新提交中的最后一个”。

在常见情况下,您可以指定更少的参数:

git rebase <parent> <branch>

这意味着“获取从 <branch> 可到达的所有提交,但不能从 <parent> 获取;在 <parent> 的当前提示顶部重新创建它们,并指向 {{1}

<branch>

这和上面一样,但它使用当前检出的分支作为 git rebase <parent>

因此,在您的情况下,以下任何一项都应产生相同的结果:

<branch>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。