且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

我无法理解git rebase - 的行为

更新时间:2023-02-01 19:12:12

tl; dr



A 上使用 git rebase --onto B 你的情况是:

  git checkout B 
git rebase --onto AB ^
$在$ 之上的c $ c>

rebase B B> $ c $引用的 B 的父项提交开始如果您对 B〜1



git rebase< branch> 和 git rebase --onto< branch> 继续阅读



Quick:git rebase



git rebase< branch> 目前已经检查过从< branch> $ c 可到达的最新提交的顶部,由 HEAD HEAD
这是最常见的重新折合,并且可以说是需要更少的

 之前之后
A --- B --- C --- F --- G(分支)A --- B --- C --- F --- G(分支)
\\\
D --- E(HEAD)D --- E HEAD)

在这个例子中, F G 是可从分支但不是从 HEAD 。说 git rebase branch 会取 D ,这是分支点之后的第一次提交,并且将它转换为分支但不是从 HEAD 可达到的最新提交 / code>,即 G



精确:git rebase - 带2个参数



git rebase --onto 允许您从特定提交开始重新分配 。它授予您对正在重新组装和在哪里进行精确控制。例如,我们假设我们需要重新分配 HEAD 这是用于需要精确的场景。 正好在从 E 开始的 F 之上。我们只关注 F 进入我们的工作分支,同时我们不想保留 D $ c

 前后
A --- B --- C- --F --- G(分支)A --- B --- C --- F --- G(分支)
\\
D --- E --- H --- I(HEAD)E --- H --- I(HEAD)

在这种情况下,我们会说 git rebase --onto FD 。这意味着:


重新实现可从 HEAD 访问的提交,其父




















$ b $ E 的父母 D 更改为˚F。然后, git rebase --onto 的语法是 git rebase --onto< newparent> < oldparent>



另一种方法是,当你想从当前分支中快速移除一些提交而不必做一个交互式重新组织:



 之前之后
A --- B --- C --- E --- F(HEAD)A --- B --- F(HEAD)

在这个例子中,为了从序列中删除 C E ,你会说 B 之上的c> git rebase - 在BE 或rebase HEAD 之处旧的父母是 E



外科医生:git rebase - 带3个参数



git rebase --onto 可以在精度方面更进一步。实际上,它允许您将任意范围的提交重新绑定到另一个提交之上。



以下是一个示例:

 前后
A --- B --- C --- F --- G(分支)A --- B --- C --- F --- G(分支)
\\\
D --- E --- H --- I(HEAD)E --- H(HEAD )

在这种情况下,我们想重新确定 E-- -H F 之上,忽略 HEAD 当前指向的位置。我们可以通过说 git rebase --onto FDH ,这意味着:


F 上重新提交父元素 D H / code>。