Git rebase子树

cd1*_*cd1 9 git branch rebase

假设我有以下场景:

    o (master)   
   /       o--o (WIP1)
  /       /
 o--o--o--o--o--o (WIP2)
(X)       \
           o--o (WIP3)
Run Code Online (Sandbox Code Playgroud)

是否有一个git命令创建一个新的分支,以便它包含分支X后的子树?我想执行"大规模的反思",我希望三个WIP分支在主人身上重新定位.

我知道我可以用一些Bash脚本来做到这一点,但我想知道如何使用git命令.

Chr*_*ial 12

没有单一的git命令.你将不得不做一些手工工作.在你的情况下:

    o (master)   
   /        o--o (WIP1)
  /        /
 X--o--o--B--o--o (WIP2)
           \
            o--o (WIP3)
Run Code Online (Sandbox Code Playgroud)

您首先将WIP1转换为master:

git rebase --onto master X WIP1
Run Code Online (Sandbox Code Playgroud)

这会导致:

               o--o (WIP1)
 (master)     /
    o--o--o--B’
   /   
  /        
 X--o--o--B--o--o (WIP2)
           \
            o--o (WIP3)
Run Code Online (Sandbox Code Playgroud)

如果你现在运行git rebase --onto master X WIP2,你会得到这样的结构:

                o--o (WIP1)
 (master)      /
     o--o--o--B’
    / \
   /   o--o--B’’--o--o (WIP2)
  /        
 X--o--o--B--o--o (WIP3)
Run Code Online (Sandbox Code Playgroud)

这可能不是你想要的,所以现在你应该改变WIP2和WIP3 B’:

git rebase --onto B’ B WIP2 
git rebase --onto B’ B WIP3 
Run Code Online (Sandbox Code Playgroud)

这会导致:

                  o--o (WIP1)
(master)         /
    o--X--o--o--B’--o--o (WIP2)
                 \
                  o--o (WIP3)
Run Code Online (Sandbox Code Playgroud)

  • 我不得不为逐步的 ascii 图表点赞。好答案。为什么任何一个答案都没有得到复选标记,@cd1? (2认同)

Von*_*onC 1

   o (master)   
   /       o--o (WIP1)
  /       /
 o--p--p--o--o--o (WIP2)
(X)      (Y)
          \
           o--o (WIP3)
Run Code Online (Sandbox Code Playgroud)

这应该是一个rebase --onto(您可以在“(您可以在“如何将某些提交移动到 git 中的另一个分支?

 git rebase --onto master X WIP1
 git rebase --onto master X WIP2
 git rebase --onto master X WIP3
Run Code Online (Sandbox Code Playgroud)

来自Chronial测试,这将给出:

         p'--p'--o--o (WIP2)
        /
 o-----o-----p--p--o--o--o (WIP1)
(X) (master)   (Y')   
        \
         p''--p''--o--o (WIP3)
Run Code Online (Sandbox Code Playgroud)

所以第一次rebase是可以的,但是你需要得到Y SHA,并且:

 git rebase --onto Y' Y WIP2
 git rebase --onto Y' Y WIP3
Run Code Online (Sandbox Code Playgroud)