我一直在与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分支上工作)完全更新所有brances。随着我的svn存储库中的所有内容都是最新的,我尝试重新设置。
使用feature1作为我的活动分支,我做了一个“git rebase trunk”,认为我将从trunk 更改为 feature1分支。结果我非常非常错。合并所有冲突后,我做了一个 git svn dcommit ,发现我的更改已经应用到主干。
我的第一个问题是我思考过程中的核心错误在哪里?我的第二个是,经过大量阅读和谷歌搜索,我看到人们支持拉动,合并和重组。鉴于我想将一个本地分支中应用的更改合并到另一个本地分支,应该我做了什么?这种情况的最佳做法是什么?
感谢您的帮助。
答案 0 :(得分:16)
您遇到的问题是rebase的命令行语法与您(非常合理的,IMO)的期望不符。
$ git checkout feature1
$ git rebase trunk
此序列将未共享的feature1提交添加到trunk的HEAD上,并且您期望它将新的trunk提交放置到feature1的HEAD上。 当你知道如何实现Git的数据模型时,语法实际上是有意义的(这无疑是它的原因)。但对我而言,这与我的预期相反,在功能上。最好将它作为一种任意的结构来学习而不是试图获得期望。
你是对的,你了解如何使用git-svn与SVN repo进行交互。所以忽略你在谷歌搜索中发现的关于推拉和合并的内容 - 这些人几乎都是正确的讨论,好像推拉和合并在git和svn中是相同的。几乎是对的还是错的。
答案 1 :(得分:-3)
您应该使用 git svn clone -s 来克隆完整的svn树,包括所有分支。从那时起,在master中使用 git svn rebase 和git svn dcommit 来处理svn,你可以创建常规的git分支供你私人使用。