1

背景

有时候,我们的分支合并了别人的有问题代码的分支(比如别人准备上线的代码,已经合并到了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,要哪个分支的代码参数就是几


花落红窗
7 声望0 粉丝