git rebase并保留所有子分支

0yg35tkg  于 2023-11-15  发布在  Git
关注(0)|答案(4)|浏览(161)

我正在尝试将CVS仓库导入git。不幸的是,我们一直在使用一种非常古老的方法从CVS仓库创建发布版本,这种方法不涉及任何实际的CVS分支或标签,而是将这些信息保存在一个单独的系统中。因此,几乎所有的开发都发生在CVS Backbone.js 上。因此,一个文件可能会在历史的早期添加,但在六个月内不会成为发行版的一部分。
我想做的是把这个CVS仓库导入git,然后使用rebase把这些提交移到开发分支。我确实有一些CVS分支,所以我真的想把所有的分支都移走。
假设我得到了这个:

F---G---H topic
                 /
A---B---C---D---E---I---J master

字符串
B是我想要移动到它自己的分支的提交。我想要的结果如下所示:

F`---G`---H` topic
               /
A---C`---D`---E`---I`---J` master
 \
  B some_unfinished_feature


但是只重定master的基会导致:

git checkout -b some_unfinished_feature B
git rebase --onto A B master

A---C`---D`---E`---I`---J` master
 \
  \               F---G---H topic
   \             /
    B---C---D---E
     \-some_unfinished_feature


我可以让git在一个rebase命令中将topic重基到E'上吗?我可能有很多分支,我想移动到它们相应的新提交上。或者有没有一种方法可以让我得到EE'之间的Map?

huwehgph

huwehgph1#

F---G---H topic
              /
 A---B---C---D---E---I---J master

 git checkout B
 git branch BRANCH-B
 git checkout master
 git rebase -i  HEAD~6

字符串
(删除提交B)

git rebase --onto D' D topic


这应该是假设没有冲突;)

uubf1zoe

uubf1zoe2#

在您的问题中,您希望从C提交开始移动。B保留为基于A的分支。
首先我们应该给它起个给予:

git branch -b some_unfinished_feature <B-ish>

字符串
此命令将从<B-ish>提交开始创建some_unfinished_feature分支。
<C-ish>位于上游。您可以查看所有将被重定基的提交:

git log <C-ish>..topic


您可以注意到IJ不会被重定基,因为它们是不同的分支。您应该稍后单独重定基。
现在从<C-ish>开始将topic重定向到<A-ish>

git rebase -p --onto <A-ish> <C-ish> topic


-p标志将保留从<C-ish>topic发生的任何合并
当此命令完成时,您将获得:

some_unfinished_feature
     /
A---B---C---D---E---I---J master
  \
   C`---D`---E`
              \   
                F`---G`---H` topic


现在,您应该将master<I-ish>重基到<E-ish>

git rebase -p --onto <E-ish> <I-ish> master


瞧:

A---B some_unfinished_feature
  \
   C`---D`---E`--I`---J` master
              \   
                F`---G`---H` topic

yuvru6vn

yuvru6vn3#

移动topic的命令是:

git rebase --onto E' E topic

字符串
不幸的是,没有办法为一堆不同的分支自动地做这件事,这是由设计决定的,每个变基都可能引入冲突,必须手动解决。
或者,您也可以将git filter-branch与配置管理软件一起使用来编写您想要的更改脚本,但这可能需要大量的工作。将master作为开发分支,并使用filter-branch创建发布分支,而不是相反,这可能更有意义。

niknxzdl

niknxzdl4#

首先,给你一个建议:当你重新建仓时,使用一个临时的分支:

git branch wip_topic
git checkout wip_topic

字符串
一旦你成功地进行了一次变基(并检查了它是否工作),你就可以将你原来的head移动到工作提交:

git checkout topic
git reset --hard wip_topic
git branch -d wip_topic


(if如果你没有这样做,发生了一些不好的事情,git reflog仍然可以保存你的培根.)
当进行变基操作时,git会跳过与目标分支上的提交文本差异匹配的提交。
如果你的master变基没有引入太多的冲突,应用:

git rebase --onto A B wip_topic


应该能给你给予想要的结果
一般来说,大多数冲突会出现在重定基提交列表的“开始”附近(<-- pinch of salt)。
假设你在构建commit C'时有冲突,但之后没有冲突,你可以重定C..topic部分的基:

git rebase --onto C' C wip_topic


无论如何:试试看,看看git的黑魔法是什么。

相关问题