背景
有时候,我们的分支合并了别人的有问题代码的分支(比如别人准备上线的代码,已经合并到了master但是发现有bug要延迟上线,而我们已经合并了master),为了不被问题代码影响进度,需要给自己没有问题的代码重新拉一个分支
操作
命令如下:
git log --reverse --author={your_name} --no-merges --pretty=%H master..{your_branch} > commits.txt
--reverse
将commit从远到近逆序,后续合并必须--author
指定提交人,有多个就指定多个参数--no-merges
剔除合并提交,一般情况并不需要--pretty
只展示每个提交的SHA1值master..{branch}
过滤出在某分支但不在master分支的提交
从master拉一个新分支,用git cherry-pick把commit全部合并到新分支上
git cherry-pick `cat commits.txt`
一行命令:
git cherry-pick `git log --reverse --author={your_name} --no-merges --pretty=%H master..{your_branch}`
异常QA
The previous cherry-pick is now empty, possibly due to conflict resolution.
说明当前的commit遗漏了前置的commit,没有这个commit后续的都合并不了,需要排查下是否遗漏了别人的或者这个日期之前的commit。也可能是你在合并提交里手动修改了代码,这个合并提交也需要合并进来,这时候会报下面的错误
error: commit {id} is a merge but no -m option was given.
说明git log找到的commit里有合并提交,cherry-pick不知道合并合并哪个的,需要指定选项-m,要哪个分支的代码参数就是几
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。