`git svn rebase`与`git rebase trunk`的区别

15

我正在处理一个使用Subversion作为代码库的项目。因为我需要进行一些还不能提交到svn服务器的更改,所以我开始使用git svn来进行本地检查。我的设定看起来像这样:

分支:主干(跟踪svn主干)、主节点(非常接近svn中的内容)以及主题。

*------------------ trunk
 \
  *-----------*--------- master
               \
                *-------- topic

流程:

[on branch master]
$ git svn fetch
$ git svn rebase
$ git checkout -b topic
$ git rebase master
[hack hack hack]
$ git commit -a
[once upstream is ready for my changes]
$ git svn fetch
$ git checkout master
$ git svn rebase
$ git checkout topic
$ git rebase master
$ git svn dcommit
$ git checkout master
$ git svn rebase
$ git branch -d topic

假设在git svn fetchgit svn rebase之间没有人提交到svn, 在主分支上运行git svn rebase基本上与在主分支上运行git rebase trunk是一样的吗?

是否有更明智的工作流程可供使用?看起来有很多分支更改和rebasing操作。我知道我想要能够将我的工作重新映射到svn中的任何内容,但似乎我正在进行比绝对必要的rebases更多的rebasing操作。

1个回答

19

请注意,来自git svn,详见 "为什么在 git-svn 中“ours”和“theirs”的含义相反":

git svn rebase

这段文字的意思是:从当前HEAD的SVN父版本中获取修订版本,并将当前(未提交到SVN)的工作与其重新定位。因此,在执行git checkout mastergit svn rebase之前,您不需要执行git svn fetch,特别是如果您只跟踪trunkmaster的父级)。
第二点,git svn dcommit 会为 master 上的每个新提交在 SVN 中创建修订版本,但您的工作流程没有显示任何关于 master 的新提交,只有关于 topic(该分支从未合并到 master)的提交。

OP Sean McMillan发表评论:

根据文档,未指定分支的git svn dcommit会推送当前HEAD上的提交,而不仅仅是master。因此,我从我的分支向SVN提交,然后依靠在master上进行git svn rebase来从SVN中将提交带回。我在dcommited之后放弃了topic分支。这样做是否合适?

他详细说明了:

我现在不能将它们发送到SVN。上游想要“冻结”主干以发布版本,同时,我正在为下一个版本的功能工作。

但最终的问题是,“git rebase trunk master与在主分支上进行git svn rebase相同吗?”如果是这样,那么我就不需要不断地更改我的分支,只需对我的主分支进行重新基础化以针对SVN即可。但如果不是,并且在我进行git svn rebase时有一些魔法发生,我想知道。

我回复道:

git svn fetch后跟git rebase trunk master相当于git svn rebase


首先,只要我在master分支上,我就不需要在执行git svn rebase之前执行git svn fetch。但是如果我在topic分支上,git svn fetch将会更新trunk,但是不会影响mastertopic分支。虽然我从来没有对我的topic分支执行过git svn rebase,但我只是使用了git rebase命令。这很有趣。 - Sean McMillan
只要我在主分支上:是的,这就是想法。每次都要执行 git checkout master - VonC
根据文档,git svn dcommit没有指定分支时会将当前HEAD上的提交推送到SVN,而不仅仅是master分支。因此,我从我的分支向SVN提交,然后依靠在master上进行的git svn rebase将提交从SVN带回来。在我完成dcommit之后,我放弃了topic分支。这样做是否合适? - Sean McMillan
“git rebase trunk master” 和 “git svn rebase on the master branch” 是一样的吗?不是,第一个是在未更改的“trunk”分支之上对“master”进行纯Git历史重写。而第二个则会先更新“trunk”。 - VonC
今天我的沟通能力可能不太好。假设我的 git svn fetch 已经更新了主干,并且此后没有人提交到主干,那么结果是否相同?当你执行 git svn rebase 时,git svn 执行哪些原始操作? - Sean McMillan
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接