我目前正致力于将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。
答案 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)
您可以使用一个小技巧重新设置多个分支/树的基数。
--preserve-merges
选项添加到您的rebase-command git reset --hard [Commit-hash of C4' (exp1)]
答案 4 :(得分:0)
这不能直接在git中完成,但是可以使用git-assembler自动进行。
要在https://stackoverflow.com/a/62835799/2792879中引用我的类似答案,请直接链接到rebasing local branches文档中的示例