Git 如果没有将提交从一个分支移动到另一个分支的图表,很难理解材料
我不理解第页的内容: 将提交从一个分支移动到另一个分支 所以,你有一个错误的地方,你想移动 从一个分支到另一个分支。为了做到这一点,您需要 了解第一次和最后一次提交的SHA(在一系列连续的 提交)要移动(如果要移动,则这些值相同 仅一次提交),移动提交的分支的名称 以及将提交移动到的分支的名称。在 下面的示例中,我将这四个值命名为$first、$last、$source, 和$destination(分别)。此外,您还需要使用 分支作为占位符。 在下面的示例中,我将把nonce分支称为“nonce”。 但是,您可以使用当前未使用的任何分支名称。你 您可以在完成后立即删除它Git 如果没有将提交从一个分支移动到另一个分支的图表,很难理解材料,git,rebase,Git,Rebase,我不理解第页的内容: 将提交从一个分支移动到另一个分支 所以,你有一个错误的地方,你想移动 从一个分支到另一个分支。为了做到这一点,您需要 了解第一次和最后一次提交的SHA(在一系列连续的 提交)要移动(如果要移动,则这些值相同 仅一次提交),移动提交的分支的名称 以及将提交移动到的分支的名称。在 下面的示例中,我将这四个值命名为$first、$last、$source, 和$destination(分别)。此外,您还需要使用 分支作为占位符。 在下面的示例中,我将把nonce分支称为“nonc
git branch nonce $last
git rebase -p --onto $destination $first^ nonce
请记住,当您在上面的命令中替换$first时,请离开
仅“^”一词是字面意思
使用gitk--all--dateorder
检查以确保移动看起来
正确(假定nonce是目标分支)。请
如果您试图移动合并,请仔细检查,它可能已经移动了
已被不正确地重新创建。如果你不喜欢这个结果,你可以
删除nonce分支(git branch-D nonce
)并重试
然而,如果一切看起来都很好,我们可以移动实际的目的地
指向nonce所在位置的分支指针:
git checkout $destination
git reset --hard nonce
git branch -d nonce
如果您再次使用gitk--all--dateorder
进行检查,您将看到
目标分支看起来是正确的。但是,提交是
仍然在源分支上。我们现在就可以解决这些问题:
git rebase -p --onto $first^ $last $source
最后一次使用gitk--all--dateorder
源分支上的提交已消失。你已经成功了
移动了提交。如果发生合并,请仔细检查
在已删除的提交之后。它们可能已被重新创建
不对。如果是这样,你可以
或者尝试删除错误合并并尝试手动重新创建,或者
从同一个SHA创建一个伪(--ours)合并,以便git知道
合并发生了
我会尽力解释我知道的和我不知道的。如果有人在每个命令后绘制提交树,我将不胜感激
首先,
git branch nonce $last (1)
git rebase -p --onto $destination $first^ nonce (2)
据我所知,(1)将commit$last复制到名为nonce的分支。在(2)中,从$first到nonce inclusive的提交范围移动到$destination的顶部。我不明白提交树如何看待这一点,因为我没有完全理解(1)的效果
那么
(3) 签出目标提交。然后在(4)处硬重置为nonce,但其效果如何?然后在(5)处删除分支nonce
最后,
git rebase -p --onto $first^ $last $source (6)
文本表示(6)导致源分支中的提交被删除。我理解这种语法,它将定义为$last的子级的提交范围放在$first的父级之上,包括$source
我确实知道git-rebase-on的语法。但我不明白这里到底发生了什么
如果您能帮助我在每个命令后绘制提交树图,我将不胜感激。这里的部分混淆可能来自术语“移动提交”。从技术上讲,不存在移动提交这样的事情。一旦创建了提交,它的内容和父指针都是不可变的,永远不能更改 但是,可以使用不同的父级创建新的提交,以实现相同的更改,这就是在这种特定情况下发生的情况 记住分支只是提交的可变指针也是很有用的 起点: 让我们假设如下
是目标分支$destination
是源分支$source
是$first
(我们要“移动”的系列中的第一个提交)C
是$last
(我们要“移动”的系列中的最后一次提交)D
git branch nonce$last
- 将名为
的新分支指针附加到nonce
提交$last
git-rebase-p——进入$destination$first^nonce
- 获取
和$first
的父级之间的所有差异(即nonce
和C
引入的更改),并将其作为新提交应用于D
$destination
- 这将导致新的提交
和C'
(原始提交D'
和C
不受影响)D
分支指针移动到新创建的提交的最后一个nonce
D'
git checkout$destination
- 将工作副本更改为
分支。这对历史图表没有影响$destination
git重置——硬当前值
- 将
分支指针移动到与$destination
nonce
- 也可以(可能更常见)通过
完成,这应该会导致快进合并,从而产生相同的结果git merge--ff only nonce
git分支-d nonce
- 删除
分支指针nonce
git-rebase-p--on$first^$last$source
- 获取
和$last
之间的所有差异(即$source
引入的更改),并将其作为新提交应用于e
($first^
的父级,即$first
git rebase -p --onto $first^ $last $source (6)
$destination | A -- B ------------------- F \ -- C -- D ----- E | $source
$destination | A -- B ------------------- F \ -- C -- D ----- E | | $nonce $source
$destination | A -- B ------------------- F \ -- C -- D ----- E \ -- C' -- D' | | $source $nonce
$destination | A -- B ------------------- F -- C' -- D' \ -- C -- D ----- E | | $nonce $source
$destination | A -- B ------------------- F -- C' -- D' \ -- C -- D ----- E | $source
$destination | A -- B ------------------- F -- C' -- D' \ -- C -- D ----- E \-- E' | $source
$destination | A -- B ------------------- F -- C' -- D' \-- E' | $source