我正在尝试将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'
上吗?我可能有很多分支,我想移动到它们相应的新提交上。或者有没有一种方法可以让我得到E
和E'
之间的Map?
4条答案
按热度按时间huwehgph1#
字符串
(删除提交B)
型
这应该是假设没有冲突;)
uubf1zoe2#
在您的问题中,您希望从
C
提交开始移动。B
保留为基于A
的分支。首先我们应该给它起个给予:
字符串
此命令将从
<B-ish>
提交开始创建some_unfinished_feature
分支。<C-ish>
位于上游。您可以查看所有将被重定基的提交:型
您可以注意到
I
和J
不会被重定基,因为它们是不同的分支。您应该稍后单独重定基。现在从
<C-ish>
开始将topic
重定向到<A-ish>
:型
-p
标志将保留从<C-ish>
到topic
发生的任何合并当此命令完成时,您将获得:
型
现在,您应该将
master
从<I-ish>
重基到<E-ish>
型
瞧:
型
yuvru6vn3#
移动
topic
的命令是:字符串
不幸的是,没有办法为一堆不同的分支自动地做这件事,这是由设计决定的,每个变基都可能引入冲突,必须手动解决。
或者,您也可以将git filter-branch与配置管理软件一起使用来编写您想要的更改脚本,但这可能需要大量的工作。将
master
作为开发分支,并使用filter-branch
创建发布分支,而不是相反,这可能更有意义。niknxzdl4#
首先,给你一个建议:当你重新建仓时,使用一个临时的分支:
字符串
一旦你成功地进行了一次变基(并检查了它是否工作),你就可以将你原来的head移动到工作提交:
型
(if如果你没有这样做,发生了一些不好的事情,
git reflog
仍然可以保存你的培根.)当进行变基操作时,git会跳过与目标分支上的提交文本差异匹配的提交。
如果你的
master
变基没有引入太多的冲突,应用:型
应该能给你给予想要的结果
一般来说,大多数冲突会出现在重定基提交列表的“开始”附近(<-- pinch of salt)。
假设你在构建commit
C'
时有冲突,但之后没有冲突,你可以重定C..topic
部分的基:型
无论如何:试试看,看看
git
的黑魔法是什么。