【Git 教程系列】cherry-pick 命令

288 阅读3分钟

介绍

应用一些已存在的提交所引入的更改

名词&符号解释

  • commit-hash git 为每次提交生成的哈希值,是一个由40个字符组成的十六进制字符串,一般取前5位就可以。
  • ^ 它可以与 commit hash 或分支名一起使用,以指定要操作的提交或一系列提交
    • <commit-hash>^: 表示指定提交的父提交
    • <branch-name>^: 表示指定分支最新提交的父提交
    • ^<branch-name>: 表示排除特定提交及其祖先
  • .. 表示两个 commit 之间的所有提交,例如:371c2..971209
  • ~ 用于指定提交的相对位置或偏移量
    • ~1: 表示当前提交的父提交
    • ~2: 表示当前提交的祖父提交

选项

  • -e, --edit 编辑提交说明
  • -n, --no-commit 不要自动提交
  • --ff 允许快进合并
  • -x 包含原始提交的引用

序列命令

  • --continue 继续操作
  • --abort 取消操作,回到操作前的样子
  • --skip 跳过当前提交
  • --quit 退出操作,会保留已经 cherry-pick 成功的 commit

序列命令只适用于正在进行的 cherry-pick 序列,而不适用于单个提交的 cherry-pick 操作

适用场景

场景一: 提取特定提交

对项目做优化需求开发时,在开发未完成时,其中一个优化项需要紧急上线,这时候就需要把这个优化项对应的 commit 提取出来,单独处理

场景二: 干净的提交记录

  • 在需求开发中,总会存在添加调试代码的场景,会产生一些无用的提交记录。我们可以将有用的提交提取出来,生成一个干净提交记录的分支
  • 当前的开发分支被污染了,比如合并了其他人的分支,这时就可以新建一个开发分支,从旧的开发分支中提取自己的 commit

操作单个提交

a-1.svg

  1. 切换到需要合并的分支
git switch <branch-name>
  1. 提取指定的提交
git cherry-pick <commit-hash>
  • <commit-hash>是要合并的提交的哈希值。可以在其他分支中使用git log命令查看提交的哈希值
  • 当执行完之后,将会自动生成一个新的 commit 进行提交,也就是会有一个新的 commit hash

其他命令

# 操作指定分支的最新提交
git cherry-pick <branch-name>

# 操作指定分支的最新提交的父提交
git cherry-pick <branch-name>^

操作多个提交

git cherry-pick <commit-hash1> <commit-hash2> ...

a-1.svg

当执行完 cherry-pick 之后,会按照指定顺序生产新的多个提交记录

操作连续多个提交

git cherry-pick <start-commit>..<end-commit> 

a.svg

可以看到,它的范围就是 start-commit 到 end-commit 之间所有的 commit,但是它这是一个 [左开,右闭] 的区间,也就是说,它将不会包含 start-commit。

而如果想要包含 start-commit 的话,就需要使用 ^ 标记一下,就会变成一个 [左闭,右闭] 的区间,具体命令如下:

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

其实 <start-commit>^ 可以理解为 start-commit 的父提交。

注意事项

  • 无论是对单个 commit 进行 cherry-pick ,还是批量处理,注意一定要根据时间线,依照 commit 的先后顺序来处理,否则会有意想不到的问题