七、cherry—pick : 一次提交多分支到位

1、概念

  • 有很多人会疑问,多分支合并代码已经有 merge 了,为什么又要多一个 cherry-pick?
    • merge 在一定情况下,会导致代码丢失,原因是merge的过程,merge的过程分为快速合并、三方合并。感兴趣的同学自行了解学习。
    • 因此,我们需要一个一次提交多次到位的方法,并且保证代码不丢失。这时候就出现了 cherry-pick
  • 流程:

    • 目前我们有两个分支 masterfeature

    •     a - b - c - d - e    Master
               \
                 f - g - h - i Feature
      
    • 现在我们需要将提交 h 合并到 master 分支上,用了 cherry-pick 就是如下的模型

    •     a - b - c - d - e - h Master
               \
                 f - g - h - i  Feature
      
    • 从上面可以看到,master 分支的末尾增加了一个提交 h

  • cherry-pick 可以让我们把某次提交合并到某一分次,而不干涉其他提交

2、cherry-pick 基本用法

  • git cherry-pick <commitHash>
    • commitHash:表示每次提交的hash值

    • 作用:将指定的提交转移到当前分支,此时当前分支产生一个新的提交,它们的哈希值会不一样。

    • git cherry-pick d476dc4
      
  • git cherry-pick <branchId>
    • branchId:表示分支名

    • 作用:转移该分支的最新提交。

    • git cherry-pick feature/dev-1.0.2
      
  • git cherry-pick <HashA> <HashB>
    • HashA:表示提交的hash值

    • 作用:将 A 和 B 两个提交应用到当前分支,这会在当前分支生成两个对应的新提交。

    • git cherry-pick 92835bef12d6975992ef026bc3f786c54134abe8 92fa72277c90017143c05169c879839533e48a9d
      
  • git cherry-picl <HashA> … <HashD>
    • HashA:表示提交的hash值

    • 作用:将一系列提交转移到该分支,必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错。

    • 注意:该这是一个左开右闭的操作 <HashA> 不会被转移到当前分支

    • 如果要包含提交 A,可以使用该语法:git cherry-pick <HashA>^…<HashD>

    • 如果想让每个commit 暂缓提交,等到所有commit都拣选完成后,自己手动commit,则添加 -n 选项

    • git cherry-pick 8607f6102c8087be496ff0175d1790f83808c27c..92fa72277c90017143c05169c879839533e48a9d //左开右闭
      
      git cherry-pick 8607f6102c8087be496ff0175d1790f83808c27c^..92fa72277c90017143c05169c879839533e48a9d //左闭右闭
      
      git cherry-pick -n 8607f6102c8087be496ff0175d1790f83808c27c^..92fa72277c90017143c05169c879839533e48a9d
      

3、cherry-pick 时代码冲突

  • –continue
    • 用户解决代码冲突后,将修改的文件重新加入暂存区,(git add .
    • 用 git cherry-pick --continue 命令,让 Cherry pick 过程继续执行。
  • –abort
    • 发生代码冲突后,放弃合并,回到操作前的样子。
  • –quit

    • 发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。

4、注意事项

  • 建议每次提交都到需要的分支进行转移,转移完成后再 pull 代码,最后进行 push
  • cherry-pick 如果发现冲突,需要进行合并,IDEA步骤如下:

    • 右键当前项目
    • 找到git
    • 在 Resolve Conflicts 中合并
    • image-20210820175841669
  • 如果 cherry-pick 出错,使用 git reset --hard id , 回到正确版本进行补救

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐