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

mok*_*tor 38 git atlassian-sourcetree

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

C0 ---- C7 (master)
 \
  \---- C1 ---- C2 ---- C4 (exp1)
   \     \       \
    \     \       \---- C3 (exp2)
     \     \
      \     \---- C5 (exp3)
       \
        \---- C6 (exp4)
Run Code Online (Sandbox Code Playgroud)

在分支上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)
Run Code Online (Sandbox Code Playgroud)

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

我也对在SourceTree中工作的解决方案感兴趣,而不必使用shell.

GoZ*_*ner 22

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

git rebase --onto master exp1
git rebase --onto c2' c2 exp2
git rebase --onto c1' c1 exp3
git rebase --onto master exp4
Run Code Online (Sandbox Code Playgroud)

关键是从旧树中的每个分支点(例如上面的c2)到新树(例如上面的c2').

  • 此处提交了一个答复(作为答案)(/sf/answers/3794433471/),表明第一行或最后一行不需要--onto ...您是否有意见并希望回答他们的答案或编辑您的答案? (2认同)

gon*_*opp 7

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

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


Rad*_*472 6

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

  1. 创建一个 DUMMY_BRANCH 例如在主人的位置
  2. 合并所有你喜欢移动到 DUMMY_BRANCH 的分支(使用--no-ff合并) - 更新来自@kdb@franckspike 的评论
  3. 将 DUMMY_BRANCH 变基到您想要的新点,并--preserve-merges为变基命令添加选项
  4. 在手动重新设置基础之后,您每个分支都转到重新设置的提交(例如,对于 C4 git reset --hard [Commit-hash of C4' (exp1)]
  5. 移动所有分支后,删除重新定位的 DUMMY_BRANCH


小智 5

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

为了启动顺序,你需要有主人的上游,即git rebase --onto master master exp1或短,没有--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
Run Code Online (Sandbox Code Playgroud)

  • 请修正相应答案中的错误,而不是提交新答案。答案应该是独立且明确的。对相关答案的评论也有效。 (6认同)