此工作流程
git checkout master
git merge feature
git push
受 SubGit 支持(在这种情况下没关系,但我建议使用
git merge --no-ff feature
防止快进合并);结果取决于您的配置。我将描述几个案例。
案例 1。(不是您的案例,但知道有用)如果主干和分支都配置为由 SubGit 同步。在这种情况下效果相当于“svn merge”命令:svn:mergeinfo
将被更新。当然,特性分支中的单个提交也会进入 SVN,因为特性分支被配置为同步。
案例2。(我认为您的情况,请检查'shelves ='选项以确保)只有主干配置为翻译,功能分支不是;并且您在存储库的 SVN Mirror 附加设置中设置了 'shelves=' 选项,通常该选项如下所示:
shelves = shelves/*:refs/shelves/*
但确切的值并不重要。在这种情况下,“git push”将推送来自主分支和特性分支的所有提交(即使您没有明确推送特性分支),因为这些提交可以通过“合并提交父级”链接访问。另一方面,特性分支 Git 引用不会被推送,因此 SubGit无法知道特性分支的名称。在这种情况下,SubGit 将在 SVN 的“架子”命名空间中创造一些临时名称,例如shelves/shelf
对应于功能分支的提交。然后它将这些单独的提交一一翻译成 SVN。最后它将在 SVN 主干中创建一个合并提交,更新 svn:mergeinfo
;毕竟它会删除它shelves/shelf
在 SVN 中(但您可以使用旧版本来引用它,Subversion 永远不会忘记)。
为了更好地理解这一点,我推荐这篇文章。第二张图片对应这个案例,例如案例 2,而第一张对应案例 1。
案例3。(不是你的情况,但有些用户更喜欢这种行为)只有trunk被配置为翻译,特性分支不是;而且你根本没有'shelves ='选项。在这种情况下,功能分支中的所有单个提交都将在 SVN 中被忽略svn:mergeinfo
,不会被更新。因此,您将在 SVN 主干中获得所有更改,但不是作为单个提交,而是作为单个 SVN 提交,所有更改都被压缩在一起,就像您正在使用一样
git merge --squash feature
代替
git merge feature
请注意,在 Git 方面,单个提交仍将被保留,它们只是不会被翻译为单个修订。
我还要补充一点,在 SVN Mirror 附加组件中,不仅支持此工作流程,而且您或您的团队成员将使用 Bitbucket Server UI 创建一个拉取请求,然后使用 UI 将其合并。这种情况下的行为与使用“git merge”+“git push”时的行为大致相同,即它将是上述 3 种情况之一。
你的其他问题呢:
不,它不会,尽管这取决于你对混乱的定义。有些人更喜欢“案例2”,称“案例3”一团糟,另一些人则持相反意见。无论哪种情况,您都可以配置插件以实现您想要的行为。
在案例 1 和 2 中——是的,在案例 3 中——否,它们将被压缩为单个 SVN 修订版。在所有情况下,单个Git提交都将按原样保留。
- 或者我应该只是将功能分支重新定位到 master 然后推送?
你可以,但我不建议你这样做。一般来说,我建议使用git pull --rebase
而不仅仅是git pull
. 但是当合并一个特性分支时,合并它比 rebase 更好。如果你重新设置它,你会直接在 master 中看到来自特性分支的单个提交(因此在 SVN 主干中),这部分没问题。但是功能分支参考将被更新,您将不得不
- 使用选项推送更新的特性分支参考,
--force
一般不推荐;或者
- 保持功能分支不变,因此在本地具有不一致的功能分支引用,并且其提交重复两次:在“主”和功能分支中。
这与 SubGit 无关(SubGit 只会将它在“主”中找到的内容转换为 SVN 主干),但会在纯 Git 中造成不便。
我是 SubGit 开发人员之一。