目录#
[[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 可能会产生冲突,这个时候就需要你认真解决冲突了。
注意事项#
-
新提交的 hash 不会和原来的一样
cherry-pick 是重新创建提交,而不是直接复制 commit hash。
-
适合挑单个或少量提交
如果需要整体合并分支,请用 git merge 或 git rebase。
-
建议加 -x 保留来源
这样以后在查看提交历史时能快速定位到原分支的提交来源。
-
避免重复挑选
如果同一个提交被多次 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 会:
- 在当前仓库中查找以 9fceb02 开头的所有提交。
- 如果只有一个提交匹配,就认为唯一。
- 如果有多个匹配,就报错要求你输入更多位。
所以
6 位只是一个习惯
• 如果出现重复,Git 会自动提示:
python
short SHA1 9fceb0 is ambiguous
评论
还没有评论,来发第一个吧
