Git 如果没有将提交从一个分支移动到另一个分支的图表,很难理解材料

Git 如果没有将提交从一个分支移动到另一个分支的图表,很难理解材料,git,rebase,Git,Rebase,我不理解第页的内容: 将提交从一个分支移动到另一个分支 所以,你有一个错误的地方,你想移动 从一个分支到另一个分支。为了做到这一点,您需要 了解第一次和最后一次提交的SHA(在一系列连续的 提交)要移动(如果要移动,则这些值相同 仅一次提交),移动提交的分支的名称 以及将提交移动到的分支的名称。在 下面的示例中,我将这四个值命名为$first、$last、$source, 和$destination(分别)。此外,您还需要使用 分支作为占位符。 在下面的示例中,我将把nonce分支称为“nonc

我不理解第页的内容:

将提交从一个分支移动到另一个分支 所以,你有一个错误的地方,你想移动 从一个分支到另一个分支。为了做到这一点,您需要 了解第一次和最后一次提交的SHA(在一系列连续的 提交)要移动(如果要移动,则这些值相同 仅一次提交),移动提交的分支的名称 以及将提交移动到的分支的名称。在 下面的示例中,我将这四个值命名为$first、$last、$source, 和$destination(分别)。此外,您还需要使用 分支作为占位符。 在下面的示例中,我将把nonce分支称为“nonce”。 但是,您可以使用当前未使用的任何分支名称。你 您可以在完成后立即删除它

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
    (我们要“移动”的系列中的最后一次提交)
步骤1:
git branch nonce$last

  • 将名为
    nonce
    的新分支指针附加到
    $last
    提交
第2步:
git-rebase-p——进入$destination$first^nonce

  • 获取
    $first
    nonce
    的父级之间的所有差异(即
    C
    D
    引入的更改),并将其作为新提交应用于
    $destination
  • 这将导致新的提交
    C'
    D'
    (原始提交
    C
    D
    不受影响)
    • nonce
      分支指针移动到新创建的提交的最后一个
      D'
步骤3:
git checkout$destination

  • 将工作副本更改为
    $destination
    分支。这对历史图表没有影响
第4步:
git重置——硬当前值

  • $destination
    分支指针移动到与
    nonce
  • 也可以(可能更常见)通过
    git merge--ff only nonce
    完成,这应该会导致快进合并,从而产生相同的结果
步骤5:
git分支-d nonce

  • 删除
    nonce
    分支指针
第6步:
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