如何使用git svn dcommit推送指定提交而非全部提交?场景求解
针对你描述的场景,我们可以通过创建临时分支的方式实现只推送commit3到SVN,同时保留commit4和commit5在本地master分支上。下面是具体步骤:
针对当前场景的操作步骤
假设你的提交父子关系是:commit5(master) → commit4 → commit3 → commit2 → git-svn → commit1(其中git-svn对应SVN的当前已同步位置,commit2已经推送到SVN):
创建临时分支指向commit3
我们需要单独针对commit3创建一个分支,这样可以只推送这个提交到SVN,而不影响master上的commit4和commit5:git checkout -b temp-push-commit3 commit3推送临时分支到SVN
在这个临时分支上执行git svn dcommit,这个命令会将从git-svn指针(当前指向commit2)到当前分支HEAD(commit3)的所有提交推送到SVN:git svn dcommit执行完成后,git-svn指针会移动到commit3,SVN的版本库也会同步到commit3。
切回master分支
推送完成后,切回你的master分支,此时master分支的提交链就会变成你期望的:commit5(master) → commit4 → commit3 → git-svn → commit2 → commit1git checkout master
推送指定提交的通用方法
Git-SVN本质上依赖SVN的线性版本模型,所以推送提交必须遵循从旧到新的顺序,不能跳过中间的提交。如果需要推送特定范围的提交(而非全部本地提交),可以遵循以下通用流程:
场景1:推送单个提交(该提交是git-svn之后的下一个提交,且后面还有未提交的本地提交)
和上面的场景类似:
- 创建临时分支,指向你要推送的目标提交
- 在临时分支上执行
git svn dcommit - 切回原分支即可,原分支上的后续提交会基于已推送的提交继续存在
场景2:推送连续的多个提交(比如从commitA到commitB,commitB比commitA新,且都在git-svn之后)
- 确认commitA是git-svn之后的第一个未推送提交,或者你希望从commitA开始推送
- 创建临时分支指向commitB:
git checkout -b temp-push-range commitB - 执行
git svn dcommit,这会将从git-svn到commitB的所有连续提交推送到SVN - 切回原分支,原分支上的后续提交(如果有的话)会基于commitB继续存在
为什么git svn dcommit --interactive不适用?
--interactive选项会让你逐个选择要推送的提交,但它的逻辑是从当前分支HEAD开始往回遍历,当你拒绝某个提交(比如commit4)时,它会终止整个推送流程,不会继续处理更早的提交(比如commit3)。这就是为什么你遇到了操作终止的问题,它无法满足“跳过后续提交,推送前面的提交”的需求。
内容的提问来源于stack exchange,提问作者themagicalyang

