能否基于非当前分支创建分支?及分支合并排除特定提交方案咨询
1. 能否基于非当前所在分支创建新分支?
完全可以,操作还挺简单的,有两种常用方式:
- 如果你想创建新分支后直接切换过去:
比如你当前在git checkout -b 新分支名 目标分支名dev分支,想基于uat创建一个叫feature-test的分支,直接执行git checkout -b feature-test uat就行。 - 如果你只想创建分支但保持当前分支不变:
执行完这条命令,你依然停留在原来的分支上,新分支已经基于目标分支创建完成了。git branch 新分支名 目标分支名
2. 如何将connection-timeout分支合并到dev并排除uat的提交?
你的场景里,connection-timeout是基于uat创建的,现在要把这个分支上仅属于你开发的补丁提交合并到dev,排除uat本身的历史内容,这完全可行,推荐两种方法:
方法一:使用git cherry-pick(适合选择部分提交或提交数量不多的情况)
这个方法会把connection-timeout上那些不属于uat的提交,逐个复制到dev分支:
- 先拉取最新的远程分支,确保本地分支是最新状态:
git fetch origin - 查看
connection-timeout上所有不属于uat的提交(也就是你自己开发的补丁):
这个命令会输出一系列简短的提交哈希和说明,这些就是你需要合并到git log uat..connection-timeout --onelinedev的目标提交。 - 切换到
dev分支:git checkout dev - 把这些提交合并到
dev:- 如果提交是连续的,可以用范围批量处理:
git cherry-pick 起始提交哈希..结束提交哈希 - 如果提交不连续,就逐个执行:
git cherry-pick 提交哈希1、git cherry-pick 提交哈希2……
- 如果提交是连续的,可以用范围批量处理:
- 如果过程中遇到冲突,解决冲突后执行
git cherry-pick --continue继续操作,或者用git cherry-pick --abort放弃整个流程。
方法二:使用git rebase --onto(适合迁移整个分支的相关提交,历史更干净)
这个方法会把connection-timeout上从uat之后的所有提交,重新“嫁接”到dev分支顶端,之后合并到dev就不会带入uat的内容:
- 先拉取最新远程分支:
git fetch origin - 切换到
connection-timeout分支:git checkout connection-timeout - 执行rebase命令迁移提交:
这条命令的意思是:把git rebase --onto dev uat connection-timeoutconnection-timeout分支中,从uat之后开始的所有提交,重新基于dev分支构建。 - 如果遇到冲突,解决冲突后执行
git rebase --continue,或者用git rebase --abort放弃操作。 - 切换到
dev分支,合并修改后的connection-timeout分支:git checkout dev git merge connection-timeout
注意事项
- 如果
connection-timeout分支已经推送到远程仓库,使用rebase会修改分支历史,这时候如果有其他同事在这个分支上开发,一定要提前沟通;相比之下cherry-pick不会修改原有分支的历史,更安全。 - 无论用哪种方法,合并前最好先在本地测试功能是否正常,确认无误后再推送到远程。
内容的提问来源于stack exchange,提问作者Mikayil Abdullayev
相关产品推荐
相关产品推荐

