前言

如果你在使用 git 进行多人协作的代码管理,合并代码( git merge )的操作你一定不陌生。git merge 会将指定分支的所有提交历史合并到当前所在的分支,它的合并单位是“分支”。但有的时候,我只想取某个分支的某几个提交的内容来合并。

遇到这种操作需求,我们可以使用 cherry-pick 命令,它是以“提交”为单位的合并,可以帮助你安全快速地达到目的。

cherry-pick 命令官方介绍

[git-cherry-pick](https://git-scm.com/docs/git-cherry-pick) 它可以在当前分支应用其他已经存在的 commit 修改,并对每一个合并过来的 commit 产生一个新的提交记录(commit hash)。

cherry-pick - Given one or more existing commits, apply the change each one introduces, recording a new commit for each.

cherry-pick 的使用

1. 基本使用

指定任何本地分支上的某个存在的提交

git cherry-pick <commitHash>

例如代码仓库有两个分支 dev 和 feat:

a - b - c - d - e   #dev\f - g - h - i  #feat

现在要将 feat 分支上的提交 g 应用到 dev 分支:

git checkout dev
git cherry-pick g

代码库的分支结构将变成:

a - b - c - d - e - g‘  #dev\f - g - h - i  #feat

dev 分支后面将会增加一个提交 g',这个提交的 commit 信息跟 feat 分支的 g 提交默认是一样的(你可以在提交过程中用 -m 选项追加内容,或者在处理冲突之后在 --continue 的时候修改,不过大部分时候,使用默认的就可以),但是会产生一个新的 commitHash。

2. 转移多个提交

  • 多个不连续的提交,提交之间用空格相隔

git cherry-pick <commitHash1> <commitHash2>
  • 连续的提交(左开右闭),使用`..`注意中间没有任何空格

git cherry-pick <start-commitHash>..<end-commitHash>
  • 连续的提交(左闭右闭)给第一个提交右侧加上`^`符号

git cherry-pick <start-commitHash>^..<end-commitHash>

注:连续的提交命令中,start-commitHash 一定要是 end-commitHash 之前的提交,否则命令将会失败,但不会报错。

3. 转移最顶端的提交

git cherry-pick <branchName>

会将指定分支的最后一次提交应用到当前分支。

4. 转移另一个代码库的提交

其实 cherry-pick 的奥义就是,只要是在一个.git仓库管理下的本地代码,任何提交都可以被应用到任何可访问的本地分支,哪怕是跨代码库:

git remote add repo2 git@xxx.git # 添加另一个代码库
git fetch repo2 # 抓取新代码库到本地
git log repo2/master # 查看新代码库master分支的提交记录
git cherry-pick <commitHashInRepo2> # 将新的代码库的某个提交应用到当前分支(跨代码库的合并)

5. 冲突处理

如果在cherry-pick的过程中,代码产生了冲突,cherry-pick 会停下来,等待我们的下一步操作决策。

  • 处理冲突。我们可以先将代码冲突在编辑器中处理好,然后回到命令行,使用 --countinue 参数让 cherry-pick 过程继续执行:

git cherry-pick --countinue
  • 放弃合并,代码回到操作前的样子

git cherry-pick --abort
  • 退出cherry-pick,但是代码不回到操作前的样子

git cheerry-pick --quit

6. cherry-pick 的一些常用配置项

  • -n, --no-commit

    只更新工作区和暂存区。不产生新的提交

  • -x

    在提交信息末尾追加一行(cherry picked from commit...)方便以后查到这个提交是如何产生的。

  • -m parent-number, --mainline parent-number

    如果原始分支是一个合并节点,那么  cherry-pick 默认会失败,因为不知道应该采用哪个分支的代码变动。 -m 配置项告诉 git 应该采用哪个分支分变动,parent-number 代表原始提交的父分支编号。

    git cherry-pick -m 1 <commitHash>
    

    一般1号父分支是接受变动分支(the branch being merged into),2号父分支是作为变动来源的分支(the branch being merged from)。

使用 cherry-pick 的好处

在一个项目中,经常会遇到这种情况:由于需求的拆分,多人同时在一个分支中开发各自负责的需求,但是在上线前,如果发现某个需求达不到验收要求,要单独延迟发布,这意味着需要我们快速建立另一个发布分支,将目前分支中属于发布需求范围的那部分代码剥离过去。

很多人面临这样的状况的第一想法可能是进行人肉比对,手动把代码从一个分支拷贝出来,然后粘贴到另一个分支去提交。我的建议是,不管是分支级别还是提交级别,只要需要合并代码,能不手动拷贝就不手动,工作量不小不说,还风险极大,一旦出了问题还不容易排查。

再次推荐 cherry-pick 这个命令,用来完成不同分支之间的部分合并操作太香了,不仅能提高效率,而且由于它是以 commit 为单位的合并,过程清晰,将来追溯问题更容易。

-- GoodLuck

参考:

https://git-scm.com/docs/git-cherry-pick

http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html

- End -

前端手札

一名WEB技术爱好者的手札

Git之cherry-pick相关推荐

  1. git cherry pick

    直接将选定的其他分支的commit,提交到该分支上 不建议使用 git rebase --onto 使用cherry pick代替 http://weblog.avp-ptr.de/20120928/ ...

  2. idea cherry pick 功能 git log 窗口 冲突conflict

    git log 窗口 参考 source tree cherry pick, merge conflict merge conflict 冲突 <<<<<<< ...

  3. IDEA git cherry pick 简单使用

    cherry pick的作用: 参考了一些博客, eg: 参考博客1 参考博客2 再做了个小案例后,我目前的理解是,cherry pick的作用是将一个分支的部分提交/历史提交,可以合并到另外一个分支 ...

  4. [gitsourcetree]cherry pick和遴选的使用

    前言 cherry pick. 拷贝其中的某一次提交记录. 本文就介绍一种更加快捷的方式 cherry pick. 介绍 此方法主要用于2分支分别独立维护的情况, 即某一分支已经上线了spring-2 ...

  5. 在gerrit上cherry pick多笔提交到一个仓库中

    我们的要求是在dvr_service仓库上从其他分支cherry pick 两笔提交到release/b03chn_rel_sop_3_nobo分支 这两笔提交分别如图所示 如图所示,B02-5746 ...

  6. 1.Cherry Pick与Create Patch的区别

    Cherry Pick与Create Patch的区别 结论 实验 场景1:应用时无冲突 场景2: 应用时产生冲突 使用cherry pick 使用patch 场景3:产生冲突,并且有其他文件的变更 ...

  7. gerrit cherry pick to merge code

    开发中经常遇到,不同branch代码需要同步修改的问题, 通过gerrit cherry pick to功能可以方便的将已提交A Branch 的修改同步到B Branch上,提升工作效率

  8. 【git cherry pick冲突】

    修好了bug愉快的打算commit提交的时候 看到提示语句是can not commit changes due to unresolved conflicts 在Android Studio中寻找图 ...

  9. golang中文文档_【译】Go 语言源码贡献官方指导文档

    以前给 Go 语言项目源码提交过一些 commits,期间阅读他们的官方指导文档的时候觉得这篇指导文档可以作为绝佳的关于大型软件项目的规范管理的参考,因为最近又提交了几个 commits,就又把这篇文 ...

  10. git 拉去merged 仓库的代码步骤

    1 首先将自己的代码提交到自己的分支仓库里面 2 代码已经提交了,可以清空本地仓库  git reset --hard HEAD^^^ 回车, 或者git reset --hard "指定的 ...

最新文章

  1. pdfbox 第一页加内容_你用代码做过哪些很酷/有趣的事?
  2. SQLServer游标简单应用(求分组最小值问题)
  3. 正则匹配字符串无匹配不到_实现简单正则表达式匹配
  4. 【安全牛学习笔记】缓冲区溢出
  5. 让DEM数据更有表现力
  6. Vegas中的色彩校正怎么用?
  7. 更改boot.ini自动进入DSRM模式
  8. 文件浏览器一定要有个向上级按钮
  9. Nginx面试题及基础
  10. 直方图规定化计算过程
  11. pip卸载pillow时的报错解决
  12. 锅打灰太狼/打地鼠项目
  13. MapReduce经典案例-TopN
  14. Java实现音频格式转换 WAV—mp3,可使音频压缩
  15. 离散数学总复习精华版(最全 最简单易懂)已完结
  16. r语言中的或怎么表示什么不同_R语言 基本语法
  17. python定义一个复数类complex_定义一个复数类Complex,使得下面的代码能够工作
  18. 机器学习常用小代码块
  19. 女生玩游戏什么款式蓝牙耳机好用?小清新高颜值游戏蓝牙耳机推荐
  20. python 创建和使用字典

热门文章

  1. 苹果发布新教育计划Apple School Manager
  2. Nginx教程(1)
  3. Python中datetime.timedelta的应用
  4. MM买裤子杀价全过程
  5. php山东jiguan大学,Guan-Jisong
  6. Python - 获取微信好友性别比例( Pie )
  7. Matlab使用入门及应用
  8. 已开源!Flutter 流畅度优化组件 keframe
  9. 投资经历(一:入市须谨慎)
  10. 移动设备网页中快速响应单击动作