van*_*owm 2 git atlassian-sourcetree
我有2个分支:master并mybranch
在mybranch基于一个古老的master承诺,我想移动到一个新的master承诺,而融合成master。
层次树目前看起来像这样:
master[commit1]---[commit2]---[commit3]---[commit4]
|
|
mybranch[commit1]---[commit2]
Run Code Online (Sandbox Code Playgroud)
我希望它是这样的:
master[commit1]---[commit2]---[commit3]---[commit4]
| |
| |
mybranch[commit1]---[commit2] mybranch[commit3]---[commit4]
Run Code Online (Sandbox Code Playgroud)
这是 Sourcetree 的截图:
当试图理解和操作的Git分支树,它知道分支的指针是很重要的最近在一个特定的谱系提交和历史追溯回从那里。较旧的提交不“属于”特定分支,它们只是在其历史记录中可达。
因此,您的实际树看起来像这样(我已将您调用的两个提交重命名commit1为commit_1和commit_b1;这是 git 提交由哈希而不是顺序 ID 引用的原因之一!):
+---[commit_2]---[commit_3]---[commit_4] <-- master
|
[commit_1]-+
|
+-- [commit_b1]---[commit_b2] <-- mybranch
Run Code Online (Sandbox Code Playgroud)
如果您以相同的方式重绘您要求的树,它将如下所示:
master
|
v
+---[commit_2]---[commit_3]---[commit_4]---[commit_b3]---[commit_b4] <-- mybranch
|
[commit_1]-+
|
+-- [commit_b1]---[commit_b2] <-- ???
Run Code Online (Sandbox Code Playgroud)
一方面提交 b1 和 b2 之间没有关系,另一方面提交 b3 和 b4 之间没有关系。分支指针“mybranch”不能同时指向它们,除非它指向一个将它们合并在一起的新提交。
然而,这可能是你想要的:请您谈一下“移动”的分支,它是什么git rebase呢。更准确地说,它复制提交,创建看起来像它们的新提交,因此提交 b3 将是 b1 的副本,而 b4 将是 b2 的副本。(原始的 b1 和 b2 提交,现在任何分支指针都无法访问,最终将被垃圾收集。)
最明确的形式git rebase要求您指定历史记录中的三个点 - 通常是分支名称,但可以是任何标识特定提交的内容:
git rebase --onto <new-parent> <old-parent> <branch>
Run Code Online (Sandbox Code Playgroud)
这意味着“获取所有提交<old-parent>,包括 的当前提示<branch>,在 之上重新创建它们<new-parent>,并指向<branch>这些新提交中的最后一个”。
在常见场景中,您可以指定更少的参数:
git rebase <parent> <branch>
Run Code Online (Sandbox Code Playgroud)
这意味着“从 获取所有可访问的提交<branch>,但不能从 获取<parent>;在 的当前提示之上重新创建它们<parent>,并指向<branch>结果。
git rebase <parent>
Run Code Online (Sandbox Code Playgroud)
这与上面相同,但它使用当前检出的分支作为<branch>.
因此,在您的情况下,以下任何一项都应产生相同的结果:
git rebase --onto master commit_1 mybranch
git rebase master mybranch
git switch mybranch; git rebase master
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
47 次 |
| 最近记录: |