11

我正在尝试将 CVS 存储库导入 git。不幸的是,我们一直在使用一种非常古老的方法从我们的 CVS 存储库创建版本,它不涉及任何实际的 CVS 分支或标签,而是将这些信息保存在一个单独的系统中。因此,几乎所有的开发都发生在 CVS 主干上。因此,一个文件可能会在历史的早期添加,但在 6 个月内不会成为发布的一部分。

我想做的是将此 CVS 存储库导入 git,并使用变基将这些提交移动到开发分支。不过我确实有一些来自 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

我可以让 gittopicE'一个变基命令中变基吗?我可能有很多分支,我想转移到它们相应的新提交上。或者有没有办法可以在 and 之间进行E映射E'

4

4 回答 4

2
               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

假设没有冲突,这应该这样做;)

于 2013-10-11T01:55:27.280 回答
0

首先,提个建议:重新打底时,请使用临时分支:

git branch wip_topic
git checkout wip_topic

一旦你有一个成功的变基(并检查它是否有效......),你可以将你的原始头部移动到工作提交:

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

(如果你不这样做并且发生了不好的事情,git reflog仍然可以保存你的培根......)


在进行 rebase 时,git 会跳过提交的文本差异与目标分支上的现有提交匹配的提交。

如果您的masterrebase 没有引入太多冲突,请应用:

git rebase --onto A B wip_topic

应该给你想要的结果。

通常,大多数冲突将出现在 rebased 提交列表的“开始”附近(<--pinch of salt)。
假设您在构建 commit 时遇到了冲突C',但之后没有冲突,您可以重新设置该C..topic部分:

git rebase --onto C' C wip_topic

无论如何:试试看,看看git黑魔法有什么作用。

于 2013-10-10T15:49:40.727 回答
0

移动的命令topic是:

git rebase --onto E' E topic

不幸的是,没有办法为一堆不同的分支自动执行此操作,这是设计使然。每个 rebase 都可能引入必须手动解决的冲突。

或者,您可以将git filter-branch与您的配置管理软件一起使用来编写您想要的更改脚本,但这可能需要大量工作。master保留作为您的开发分支并用于创建发布分支可能更有意义filter-branch,而不是相反。

于 2013-09-25T20:54:32.000 回答
0

在您的问题中,您想从C提交开始。B保留为基于 的分支A

首先我们应该给它命名:

git branch -b some_unfinished_feature <B-ish>

此命令将从提交some_unfinished_feature开始创建分支。<B-ish>

<C-ish>上游。您可以查看所有将被重新定位的提交:

git log <C-ish>..topic

您会注意到,I并且J不会因为它们是不同的分支而重新设置基础。您应该稍后单独对其进行变基。

现在重新topic定位<A-ish><C-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<E-ish> from<I-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
于 2018-05-18T17:30:19.043 回答