紧急发布用cherry-pick检出当前分支所有我的提交记录

本文介绍了一种在紧急情况下,如何通过Git的Cherry-Pick命令和Shell脚本,快速将特定开发者的提交从开发分支迁移到紧急发布分支的方法。此过程包括查询提交历史、创建新分支、自动化挑选并应用提交。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

公司接了个新项目,需在平台上增加几个新接口,问题是本来说是和平台一起迭代发布的时间提前了,但当前的代码都和其他开发人员一起提交到了develop中,现在要提前发布只能从master拉出一个分支来把我的提交都添加上去然后测试发布。

操作命令

cherry-pick

当时想到的第一个命令就是这个,检出我的所有提交,然后应用到另一个分支中去。平时使用这个命令只是简单的pick一个提交,现在需要编写个shell脚本,自动化我们某段时间内的操作全都pick到新分支上去。

git log

这里面我们还用到一个很重要的命令git log用来查询我的所有提交日志,最后输入想要的commit IDgit cherry-pick使用,下面是git log常用的格式占位符写法及其代表的意义:
git log常用的格式占位符

Shell脚本

由于公司代码不好贴出来,所以只能介绍操作方法了。

  • 开发分支:develop
  • 线上分支:master
  • 紧急发布分支:hotfix/urgent-publish(不要太关注这个名字,哈哈,和平台的打包策略有关)
  • 我提交的commit author名称:Charles

我们现在定义操作的步骤:

  • 拉取最新的master代码,查看提交记录

    gco master;git pull;git log --author="Charles" --reverse --pretty=format:"%H %ad %s" | cat
    
  • 创建紧急发布分支

    git checkout -b hotfix/urgent-publish;git push --set-upstream origin hotfix/urgent-publish
    
  • 拉取最新的develop的代码,查看提交记录

    gco develop;git pull;git log --author="Charles" --reverse --pretty=format:"%H %ad %s" | cat
    
  • grep所有我之前的提交记录,然后把commit打印出来,并输出到一行,赋值给变量commits

    commits=($(git log --author="Charles" --since=2020-05-10 --reverse --pretty=format:"%H %s" | grep -v "Merge branch" | awk '{print $1}' | tr -s "\n" " "))
    
  • 对每个commit循环应用cherry-pick,最后提交到发布分支中去

    for commit in $commits;do git cherry-pick $commit;done
    git push origin hotfix/urgent-publish
    
<think>我们被要求批量cherry-pick某个分支中某个提交之后的所有提交。在Git中,cherry-pick通常用于选择单个或多个提交进行应用,但这里要求从某个提交开始(不包括该提交)直到分支末梢的所有提交。思路:1.首先确定起始提交(我们不想包含的那个提交)和结束提交(通常是分支的HEAD)。2.获取从起始提交的下一个提交分支末梢的所有提交的哈希值列表。3.然后对这些提交进行批量cherry-pick操作。但是,gitcherry-pick命令可以接受多个提交哈希,也可以使用区间表示。然而,cherry-pick不支持直接使用区间语法(如A..B)来代表一系列提交,但我们可以通过其他方式生成提交列表。具体步骤:步骤1:获取提交范围假设我们有一个分支名为feature,我们想要从提交A之后(不包括A)到分支末梢(HEAD)的所有提交。我们可以使用gitlog命令来获取这些提交的哈希列表。命令:`git log--reverse --pretty=format:%H <commit-A>..feature`解释:- `<commit-A>..feature`:表示从提交A之后到feature分支末梢的所有提交-`--reverse`:因为我们希望按照从旧到新的顺序cherry-pick,这样避免冲突的可能性(虽然冲突可能仍会发生,但顺序很重要)。-`--pretty=format:%H`:只输出提交的完整哈希值。步骤2:将获取的提交哈希列表传递给cherry-pick我们可以使用xargs或者直接将这些哈希值作为参数传递给cherry-pick。例如:`git cherry-pick$(gitlog --reverse --pretty=format:%H <commit-A>..feature)`但是,如果提交数量很多,可能会超出命令参数的长度限制。为了避免这个问题,我们可以使用一个脚本来逐个cherry-pick,或者使用一个循环。另一种方法是使用分支提交区间直接cherry-pick,但是cherry-pick命令不支持区间,所以我们可以使用一个更简单的循环:```bashfor commitin $(git log--reverse--pretty=format:%H<commit-A>..feature); dogit cherry-pick$commitdone```注意:如果中间出现冲突,cherry-pick会停止,需要手动解决冲突后,使用`gitcherry-pick --continue`继续。或者,如果你想在冲突时中止整个操作,可以添加错误处理。步骤3:处理冲突(可选)在批量cherry-pick时,冲突是常见的。你可以选择在每次冲突时解决,然后继续。或者,如果希望自动化,但冲突处理通常需要人工干预。另外,如果希望一次性cherry-pick所有提交而不中断,可以使用`-n`(不自动提交)选项,然后最后一起提交。但这样可能会使冲突更难解决,因为所有修改都混在一起。因此,通常建议按顺序一个一个地cherry-pick,这样冲突更容易解决。示例:假设我们要将分支feature上从提交A(哈希为a1b2c3d)之后的所有提交cherry-pick当前分支。命令:```bash#获取提交列表,按时间顺序从旧到新commits=$(gitlog --reverse --pretty=format:%H a1b2c3d..feature)#逐个cherry-pickforcommit in$commits;dogitcherry-pick $commitdone```注意:如果feature分支不是本地分支,确保先获取:`gitfetch originfeature:feature`(如果需要)。引用说明:[^1]提到了cherry-pick的基本用法,包括单个提交和多个提交。[^3]提到了cherry-pick的适用场景,例如将某个分支中的某个提交快速合并到其他分支。因此,我们可以根据上述思路来实现批量cherry-pick。但是,还有一种更简单的方法:使用gitformat-patch和gitam,但这里要求cherry-pick,所以我们使用上述方法。另外,如果提交区间是线性的,我们也可以使用rebase来移植这部分提交,但rebase会改变提交历史,而cherry-pick是在当前分支上创建新的提交。总结:我们使用循环逐个cherry-pick从起始提交之后到分支末梢的所有提交。相关问题:1.如果cherry-pick过程中出现冲突,如何跳过当前提交?2.如何撤销一次批量cherry-pick操作?3.除了cherry-pick,还有哪些方法可以移植一系列提交?</think>### 批量 Cherry-Pick 某个提交之后的所有提交Git 中批量执行 cherry-pick 操作,移植某个提交之后的所有提交,可以按照以下步骤操作: #### 核心步骤 1. **获取提交范围** ```bash # 获取起始提交的哈希值(不含该提交git checkout <源分支> git log --oneline # 定位目标提交的哈希值 # 获取从目标提交之后到分支末梢的所有提交哈希列表 # 按时间顺序排列(从旧到新) commits=$(git rev-list <目标提交哈希>..HEAD --reverse) ``` 2. **批量执行 Cherry-Pick** ```bash # 切换到目标分支 git checkout <目标分支> # 批量应用提交(按顺序) git cherry-pick $commits ``` #### 完整操作示例 假设要将 `develop` 分支提交 `abc123` 之后的所有更改移植到 `master` 分支: ```bash # 获取提交列表(从abc123之后到develop分支末梢) git checkout develop commits=$(git rev-list abc123..HEAD --reverse) # 切换到master分支并批量应用 git checkout master git cherry-pick $commits ``` #### 注意事项 1. **冲突处理**: - 若出现冲突,Git 会暂停 cherry-pick 过程 - 手动解决冲突后执行: ```bash git add . git cherry-pick --continue ``` - 或放弃当前 cherry-pick: ```bash git cherry-pick --abort ``` 2. **提交顺序保证**: - `--reverse` 参数确保按时间顺序应用提交(从旧到新) - 避免因依赖关系导致的冲突 3. **替代方案**: ```bash # 使用xargs直接传递提交列表(需确保无空格) git log --format=%H abc123..HEAD --reverse | xargs git cherry-pick ``` #### 应用场景 此方法适用于: - 将特定功能相关的多个提交移植到稳定分支 - 修复生产环境问题时选择性移植补丁 -分支同步特定区段的代码变更[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值