24

我一直在与 git/git-svn 学习曲线作斗争,昨晚,作为学习曲线的一部分,我做了一些非常非常糟糕的事情。我已经纠正了它,但我希望以我的方式理解错误。

我有一个 svn 存储库,我从中克隆了主干和分支(我忽略了标签,因为我们不处理这些标签)。使用 git,我为当前需要使用的每个分支创建了本地分支:

$ git checkout -b trunk svn/trunk
$ git checkout -b feature1 svn/branches/development/feature1
$ git checkout -b maint svn/branches/maintenance/previous-version

我将 feature1 设为我的活动分支并进行了一些更改,然后才离开几天。我昨天回到它想整合对主干所做的任何更改,以便我使用最新和最好的。我所做的是首先通过git svn rebase对所有分支进行完整更新(没有其他人在 feature1 分支上工作过)。随着我的 svn 存储库中的所有内容都是最新的,我尝试重新设置基准。

使用 feature1 作为我的活动分支,我做了一个“git rebase trunk”,认为我会将更改从主干拉到feature1 分支。原来我是非常非常错误的。合并所有冲突后,我做了一个git svn dcommit并发现我的更改已应用于主干。

我的第一个问题是我思考过程中的核心错误在哪里?第二个是,在大量阅读和谷歌搜索之后,我看到人们支持拉取、合并和变基。鉴于我想将一个本地分支中应用的更改合并到另一个本地分支,我应该怎么做?这种情况的最佳做法是什么?

谢谢你的帮助。

4

2 回答 2

16

您遇到的问题是 rebase 的命令行语法与您(非常合理,IMO)的期望不符。

$ git checkout feature1
$ git rebase trunk

此序列将未共享的 feature1 提交添加到主干的 HEAD 上,并且您期望它将新的主干提交放置到 feature1 的 HEAD 上。当您知道 Git 的数据模型是如何实现的时,该语法实际上是有一定意义的(这无疑就是它的原因)。但对我来说,这与我所期望的相反,在功能上。最好将它作为一个任意的结构来学习,而不是试图抱有期望。

没错,您了解如何使用 git-svn 与 SVN 存储库进行交互。所以忽略你在谷歌上搜索到的关于推拉和合并的内容——有很多人认为推拉和合并在 git 和 svn 中是相同的。几乎正确仍然是错误的。

于 2009-02-24T19:00:51.577 回答
-3

您应该使用git svn clone -s克隆完整的 svn 树,包括所有分支。从那时起,在master中使用git svn rebase 和git svn dcommit来处理svn,你可以创建常规的git分支供你私人使用。

于 2009-02-24T16:06:57.827 回答