我怎样才能一次折叠多个分支?

时间:2014-04-30 11:00:18

标签: git atlassian-sourcetree

我目前正致力于将SVN用作存储库的项目。在当地,我做了几个"实验"使用我不想承诺回购的代码。因此,我在SVN工作目录的顶部本地使用git,并使用多个分支进行不同的实验"。所以它看起来像像这样。

C0 ---- C7 (master)
 \
  \---- C1 ---- C2 ---- C4 (exp1)
   \     \       \
    \     \       \---- C3 (exp2)
     \     \
      \     \---- C5 (exp3)
       \
        \---- C6 (exp4)

在分支master上我希望有无污染的SVN回购,即C0是SVN Repo Revision x,C7是SVN Repo Revision x + n。

以某种方式很容易地将所有exp分支一次性地重新分配到C7上,使得树看起来如下图所示?

C0 ---- C7 (master)
         \
          \---- C1' ---- C2' ---- C4' (exp1)
           \     \         \
            \     \         \---- C3' (exp2)
             \     \
              \     \---- C5' (exp3)
               \
                \---- C6' (exp4)

我想使用rebase,因为我不想修改本地SVN Checkout的状态,并希望我的更改建立在SVN修订版之上。

我也对在SourceTree中工作的解决方案感兴趣,而无需使用shell。

5 个答案:

答案 0 :(得分:21)

您无法一步到位。最好你逐一移动每个分支;这将是序列:

git rebase --onto master exp1
git rebase --onto c2' c2 exp2
git rebase --onto c1' c1 exp3
git rebase --onto master exp4

关键是将旧树中的每个分支点(例如上面的c2)重新绑定到新树(例如上面的c2')。

答案 1 :(得分:6)

正如GoZoner所回答的那样,使用裸git命令无法做到这一点,但它可以通过结合各种git管道命令的脚本来支持这种重新定位。

我写了一个工作示例,你可以找到它on github

答案 2 :(得分:3)

我只想提到GoZoner的序列在第一行(也是最后一行)中有一个错误。 exp1不是上游,而是您要重新设置基准的分支。

为了开始序列,您需要将master作为上游,即git rebase --onto master master exp1或short,如果没有--onto,它将是git rebase master exp1。 问题中示例的总正确顺序为:

git rebase master exp1
git rebase --onto c2' c2 exp2
git rebase --onto c1' c1 exp3
git rebase master exp4

答案 3 :(得分:0)

您可以使用一个小技巧重新设置多个分支/树的基数。

  1. 创建DUMMY_BRANCH,例如在主控位置
  2. 合并所有要转移到DUMMY_BRANCH的分支
  3. 将DUMMY_BRANCH重新设置为所需的新点,并将--preserve-merges选项添加到您的rebase-command
  4. 手动重新设置基础后,每个人都分支到重新基于基础的提交(例如,对于C4 git reset --hard [Commit-hash of C4' (exp1)]
  5. 移动所有分支机构后,删除重新设置了基础的DUMMY_BRANCH

答案 4 :(得分:0)

这不能直接在git中完成,但是可以使用git-assembler自动进行。

要在https://stackoverflow.com/a/62835799/2792879中引用我的类似答案,请直接链接到rebasing local branches文档中的示例