我的git-svn repo中有许多本地提交的补丁,我尚未提交给我们的svn回购。正常的“git svn dcommit”会将所有这些补丁提交给svn。我只想提交一些补丁(简单的错误修复),但不提交其他补丁(未经测试的重大修改)。我怎么能用git svn做到这一点?
答案 0 :(得分:10)
答案 1 :(得分:5)
这就是我最终做的事情。起点是与svn同步的“master”分支,我的所有本地补丁都在顶部。
创建一个新分支(wip =正在进行中)。
git branch wip
这会生成当前分支的副本,包括尚未提交给svn的所有补丁。当前分支将保持为“主”并且不会更改。
使用rebase从
git rebase -i HEAD~10
现在“master”分支有你可以安全提交的补丁:
git svn dcommit
“wip”分支现在有一些尚未准备好分享的重大变化。实际上,我希望他们留在那里这是我停止的地方。一切都完成后,可以从“wip”分支执行svn dcommit。但为了完整起见,并回答原始问题,还有最后一步:
使用git cherry-pick
将未提交的更改提取回“master”分支,最后使用git branch -d wip
删除无用的分支。
答案 2 :(得分:2)
使用git,你实际上不应该在单个变更集上运行。我所知道的最好的方法是为任何非平凡的工作创建本地分支。这样,您未经测试的主要更改将最终出现在您的git存储库的不同分支中,并且您将能够非常轻松地区分它们。
如果这是您目前遇到的问题,您可以创建一个新的分支,从上次从svn更新的点开始,然后使用git-cherry-pick将您的简单错误修复转移到这个新的分支,从中然后你可以提交给svn。
从更长远的角度来看,最好有自己的“主”分支由subversion trunk构成,然后是:
git diff ..my_branch | patch -p1
将内容合并到主人的dcommits,这将消除git-svn无法处理的历史记录。这种方法对于最终合并来说更复杂,但允许你在git本身之间合并分支(可能还有其他人)。