cherry-pick命令
Git

cherry-pick命令

JACIN··7 分钟阅读

目录#

[[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

评论

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