cherry-pick命令
Git

cherry-pick命令

JACIN4 分钟阅读
AI 摘要

这篇笔记聚焦 git cherry-pick 在分支协作中的精确搬运能力:当只需要把其他分支上的某个小功能或少量提交带到当前分支,而不想合并整个分支时,可以直接在目标分支执行 cherry-pick。内容从单个提交开始,说明 cherry-pick 会在当前分支重新生成一个内容相同但哈希不同的新提交,并给出 -x 记录原始提交来源、-n 只把改动应用到工作区和暂存区而不自动提交等常用选项。对于多个提交,笔记区分了不连续提交逐个列出和连续范围选择两种写法,并解释 A..D 表示不含 A、包含 D,A^..D 则把 A 到 D 都纳入范围。文章也强调了使用前提和风险:一个小功能最好对应一次 commit,否则后续挑选会变得困难;cherry-pick 过程中可能发生冲突,同一个提交重复挑选还可能因为哈希不同而在历史中形成重复内容。与 merge、rebase 的对比进一步明确了适用边界:merge 适合合并整个分支并保留结构,rebase 用于重写基线和线性化历史,cherry-pick 则适合只引入必要提交。最后补充的 commit hash 说明解释了 Git 提交哈希由文件树、父提交、提交者、时间和说明等内容计算而来,完整 SHA-1 为 40 位十六进制,短哈希只要在仓库中足够长且唯一即可被识别。

目录#

[[toc]]

【注意前提,一个小功能必须一次 commit,否则功能太多 就很难 pick 了】

基础介绍#

用来在当前分支上应用另一个分支的某个(或多个)提交

从其它分支挑选某些提交到当前分支

python
main ----A----B----C
   \
    feature ----D----E

假设你想把 feature 分支中的 D 提交单独合到 main,而不想合整个 feature 分支。

那么在 main 分支执行:

(单个提交)

python
git cherry-pick <D的commit哈希>

就会在 main 分支重新生成一个新的提交(内容与 D 一致,但 commit hash 全新)。

保留原始提交的 author 信息

python
git cherry-pick -x <commit>
# 会在提交信息中追加 "(cherry picked from commit <hash>)"
# 便于将来查找原始来源

只应用修改,不产生提交

python
git cherry-pick -n <commit>
# -n/--no-commit:把改动应用到工作区和暂存区,但不自动生成提交

多个不连续的提交

python
git cherry-pick commit1 commit2 commit3

连续多个提交

python
git cherry-pick A..D   # 把 (A, D] 范围内的提交依次挑过来
git cherry-pick A^..D  # 把 [A, D] 范围内的提交挑过来

注意 在 cherry-pick 可能会产生冲突,这个时候就需要你认真解决冲突了。

注意事项#

  1. 新提交的 hash 不会和原来的一样

    cherry-pick 是重新创建提交,而不是直接复制 commit hash。

  2. 适合挑单个或少量提交

    如果需要整体合并分支,请用 git merge 或 git rebase。

  3. 建议加 -x 保留来源

    这样以后在查看提交历史时能快速定位到原分支的提交来源。

  4. 避免重复挑选

    如果同一个提交被多次 cherry-pick 到同一分支,Git 会认为它们是不同的提交(因为 hash 不同),可能造成重复内容。

命令适用场景commit hash提交历史
merge合并整个分支不变保留完整分支结构
rebase重写分支基线改变线性化历史
cherry-pick仅复制部分提交改变仅引入需要的提交

commit hash#

  • 每次提交都会生成一个 40 位十六进制的 SHA-1 哈希
  • 哈希内容包含:
    • 文件树的内容(tree)
    • 父提交 hash
    • 提交者信息
    • 提交时间
    • 提交说明
  • 计算方式大致是:
python
sha1("commit " + 数据长度 + "\0" + commit内容)

• 结果是一个 160 位二进制数 → 用 16 进制表示就是 40 个字符

Git 在查找 commit 时,允许你只输入一个足够长且唯一的前缀。例如:

python
git show 9fceb02

Git 会:

  1. 在当前仓库中查找以 9fceb02 开头的所有提交。
  2. 如果只有一个提交匹配,就认为唯一。
  3. 如果有多个匹配,就报错要求你输入更多位。

所以

6 位只是一个习惯

• 如果出现重复,Git 会自动提示:

python
short SHA1 9fceb0 is ambiguous

评论

还没有评论,来发第一个吧