gpt4 book ai didi

git - 将分支加入新的主提交而不 merge ?

转载 作者:行者123 更新时间:2023-12-02 18:56:58 26 4
gpt4 key购买 nike

我有 2 个分支:mastermybranchmybranch 基于旧的 master 提交,我希望将其移动到新的 master 提交,而不需要 merge 到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 提交由哈希引用而不是顺序 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”不能指向它们两者,除非它指向将它们 merge 在一起的新提交。

但是,这可能正是您想要的:您谈论“移动”分支,即 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> 的当前提示之上重新创建它们,并将 <branch> 指向结果。

git rebase <parent>

这与上面相同,但它使用当前 checkout 的分支作为 <branch> .

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

git rebase --onto master commit_1 mybranch
git rebase master mybranch
git switch mybranch; git rebase master

关于git - 将分支加入新的主提交而不 merge ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66080228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com