[英]Merge git branch onto svn branch using subgit
我使用BitBucket的Subgit插件将svn存储库镜像为git存储库。 只有主干分支(在git中称为master)已被标记为同步,但是使用git存储库的开发人员已创建了一个功能分支,并向git分支(未同步)提交了十二个提交。
现在,两个分支都有几次提交,我们想将git feature分支合并回主干svn分支。 subgit文档尚不完全清楚,是否可以使用以下功能:
git checkout master
git merge feature
git push
要注意的另一件事是,合并将需要合并提交,因为必须解决冲突。
这个工作流程
git checkout master
git merge feature
git push
由SubGit支持(在这种情况下没有关系,但是我建议使用
git merge --no-ff feature
防止快速合并); 结果取决于您的配置。 我将描述几种情况。
案例1.(不是你的情况,但需要了解的)如果两个主干和分支被配置成由SubGit同步。 在这种情况下,效果等同于“ svn merge”命令: svn:mergeinfo
将被更新。 当然,由于功能分支配置为同步,因此功能分支中的单个提交也将进入SVN。
情况2。(我想您的情况是肯定的,请选中'shelves ='选项)仅将中继配置为要翻译,而功能分支未配置; 而且你有 “货架=”选项SVN镜设置附加设置存储库,通常的选择是这样的:
shelves = shelves/*:refs/shelves/*
但是确切的值并不重要。 在这种情况下,“ git push”将同时推送master和feature分支中的所有提交(即使您没有显式推送feature分支),因为可以通过“ merge commit parent”链接访问这些提交。 另一方面,要素分支Git参考不会被推送,因此SubGit 无法知道要素分支的名称 。 在这种情况下,SubGit将在SVN的“货架”名称空间中发明一些临时名称,例如,对应于功能分支提交的shelves/shelf
。 然后, 它将这些单独的提交一对一地转换为SVN。 最后,它将在SVN干线上创建合并提交, 更新 svn:mergeinfo
; 毕竟它将删除 SVN中的那个shelves/shelf
(但是您可以使用旧版本来引用它,Subversion永远不会忘记)。
为了更好地理解,我推荐这篇文章 。 第二张图片对应于这种情况,例如案例2,而第一张图片对应于案例1。
情况3。(不是您的情况,但某些用户更喜欢这种行为)仅将中继配置为要翻译,而功能分支不是。 而且您根本没有 'shelves ='选项。 在这种情况下,功能分支中的所有单个提交都将在SVN中被忽略 , svn:mergeinfo
将不会被更新 。 因此,您将在SVN主干中获得所有更改,但不是作为单个提交,而是作为单个SVN提交,所有更改都被压缩在一起,就好像您在使用
git merge --squash feature
代替
git merge feature
请注意,在Git方面,单个提交仍将保留,它们不会被翻译为单个修订。
我还要补充一点,在SVN Mirror插件中,不仅支持此工作流程,而且您或您的团队成员将使用Bitbucket Server UI创建一个Pull Request,然后使用UI合并它。 这种情况下的行为与使用“ git merge” +“ git push”时的行为大致相同,即它将是上述3种情况之一。
您的其他问题呢?
不,这不会取决于您对混乱的定义。 有些人喜欢“案例2”,称“案例3”一团糟,另一些人则持相反意见。 无论哪种情况,您都可以配置加载项以实现所需的行为。
在情况1和2中-是,在情况3中-不,它们将被压缩为单个SVN版本。 在所有情况下,单个Git提交都将被保留。
您可以,但是我不建议您这样做。 通常,我建议使用git pull --rebase
而不是git pull
。 但是,合并功能分支时,合并它比重新设置基础更好。 如果重新设置基础,您将直接在master中(因此在SVN干线中)看到来自功能分支的单个提交,这部分就可以了。 但是功能分支参考将被更新,您将必须
--force
选项推送更新的功能分支引用,一般不建议这样做; 要么 这与SubGit无关(SubGit只会转换为SVN干线,它将在“主”中找到),但会给纯Git带来不便。
我是SubGit开发人员之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.