代码之家  ›  专栏  ›  技术社区  ›  Zsolt Szilagyi

如何将当前编辑拆分为几个新的git分支?

  •  0
  • Zsolt Szilagyi  · 技术社区  · 7 年前

    我在一个新的git分支中做了几十次编辑,我称之为“performance”。现在我接到命令,将这些编辑拆分为几个分支,称为“性能前端”、“性能日志”等。

    这能做到吗?Ot还有其他(既定)方法吗?

    3 回复  |  直到 7 年前
        1
  •  2
  •   kdb    4 年前

    据我所知,你的处境与我目前的处境相似: 对同一分支进行了多种更改,但应

    Current state:
    ... -- A (master) -- C1 -- B1 -- B2 -- C2 -- B3 -- C3 -- B4 (devel)
    
    Wanted state:
    ... -- A (master) -- B1’ -- B2’ -- B3’ -- B4’ (branch-B)
            \
             `---------- C1’ -- C2’ -- C3’ (branch-C)
    

    执行软重置以 master ,并逐行提交更改 具有 git gui ,用提交消息标记每个更改 A B 让我们假设这样的准备已经发生,并且提交 An , Bn

    人工采摘樱桃最终可能很容易出错 git rebase -i 在临时分支上,为了安全起见。

    >> git checkout devel
    >> git checkout -b tmp
    
    ... -- A (master) -- C1 -- B1 -- B2 -- C2 -- B3 -- C3 -- B4 (devel, tmp, HEAD)
    
    >> git rebase -i master
    

    这将打开一个重新基准任务文件。它默认为

    pick 552fe03 C1
    pick cbf327a B1
    pick bd1ca26 B2
    pick 95320e6 C2
    pick 7f21156 B3
    pick 910a6fe C3
    pick bfda579 B4
    

    这实际上是将分支重置为 rebase文件中列出的命令。在默认设置下,它基本上

    1.重新排序提交。

    因此,我们对提交进行了重新排序。

    pick cbf327a B1
    pick bd1ca26 B2
    pick 7f21156 B3
    pick bfda579 B4
    pick 552fe03 C1
    pick 95320e6 C2
    pick 910a6fe C3
    

    根据所做的更改,可能会发生合并冲突,这取决于 rebase 可以继续 git rebase --continue .

    git rebase -i master 你自己必须中止重新设定基准。

    结果将是:

    ... -- A (master) -- C1 -- B1 -- B2 -- C2 -- B3 -- C3 -- B4 (devel)
            \
             `-- B1 -- B2 -- B3’ -- B4’ -- C1’ -- C2’ -- C3’ (tmp, HEAD)
    

    我们现在可以创建新的分支,

    >> git branch branch-C tmp
    >> git branch branch-B <hash-of-B4’>
    

    给出一个状态

    ... -- A (master) -- -- B1 -- B2 -- C1 -- B3 -- C2 -- C3 -- B4 (devel)
            \
             `-- B1’ -- B2’ -- B3’ -- B4’ (branch-B) -- C1’ -- C2’ -- C3’ (tmp, branch-C, HEAD)
             
    

    this answer Split a git branch into two branches? , 我们现在可以使用表单的rebase命令

    >> git rebase --onto NEW_PARENT OLD_PARENT BRANCH_TO_MOVE
    

    在这种情况下:

    >> git rebase --onto master branch-B branch-C 
    
    ... -- A (master) -- B1 -- B2 -- C1 -- B3 -- C2 -- C3 -- B4 (devel)
           |
           |`-- B1’ -- B2’ -- B3’ -- B4’ (branch-B) -- C1’ -- C2’ -- C3’ (tmp)
           |
            `-- C1’’-- C2’’-- C3’’ (branch-C, HEAD)
            
    

    如果一切都成功了,剩下的就是强制删除不推荐使用的/临时的分支(正常删除 -d 在这里不起作用)。

    >> git branch -D devel
    >> git branch -D tmp
    
    ... -- A (master) -- B1’ -- B2’ -- B3’ -- B4’ (branch-B)
            \
             `---------- C1’’-- C2’’-- C3’’ (branch-C, HEAD)
             
    

    没有临时分支。

    你当然不会 使用临时分支。然后命令将是

    >> git checkout devel
    >> git rebase -i master     # for reordering
    >> git branch -m branch-C   # rename ‘devel’ to ‘branch-C’
    >> git branch branch-B <hash-of-B4’>
    >> git rebase --onto master branch-B branch-C
    

    但折扣 可以 然后必须从 git reflog .

        2
  •  1
  •   MrKekson    7 年前

    将分支重置回开始的提交位置(不,很难!)。 git status .

    现在,在这之后,使用您最喜欢的git gui,或者 git add -i

    或者你可以创建你想要的分支,然后从你想要的地方(如果你提交了它们,那么它在逻辑上是按你想要的那样分开的)挑选提交,只需保持它们的顺序,以避免不必要的冲突。

    见鬼,你甚至可以复制你的更改,检查你的起点,然后复制回来,然后提交它们。(这个不是基于Git的:D)还有其他方法

        3
  •  1
  •   NickD    7 年前

    你可以做的 git add/git commit