如何解决将分支加入新的主提交而不合并?
我有 2 个分支:master
和 mybranch
mybranch
基于旧的 master
提交,我希望移动到新的 master
提交而不合并到 master
。
层次树目前看起来像这样:
master[commit1]---[commit2]---[commit3]---[commit4]
|
|
mybranch[commit1]---[commit2]
我希望它是这样的:
master[commit1]---[commit2]---[commit3]---[commit4]
| |
| |
mybranch[commit1]---[commit2] mybranch[commit3]---[commit4]
这是 Sourcetree 的截图:
解决方法
在尝试理解和操作 git 分支树时,重要的是要知道分支是指向特定谱系中最近提交的指针,并且历史可以回溯 从那里。较旧的提交不“属于”特定分支,它们只是在其历史记录中可访问。
所以你的实际树看起来像这样(我已经将你称为 commit1
的两个提交重命名为 commit_1
和 commit_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 举报,一经查实,本站将立刻删除。