git 挑选:git cherry-pick
Cherry-Pick(挑选)
git cherry-pick
将一个或多个特定的提交从一个分支应用到另一个分支。它的主要作用是选择性地合并提交,而不是合并整个分支。与 merge
和 rebase
不同,cherry-pick
只处理单个或多个指定的提交,而不是整个分支的历史。
[应用举例] (heads/dev) git cherry-pick 125a1d1 的详细工作原理
1、Git 会先检查工作目录,如果存在冲突或未提交的更改,Git 会提示你先提交或暂存更改。
2、获取提交 125a1d1
的对象信息,提取该提交的父提交(假设是 abc1234
),使用 git diff abc1234 125a1d1
生成一个补丁文件(patch),尝试将这个补丁应用到当前分支 dev
的最新提交(即 HEAD
)之后,如果有冲突,Git 会在冲突文件中标记冲突区域,并暂停 cherry-pick
,等待用户手动解决冲突,用户解决后运行 git commit
继续完成 cherry-pick
。
3、创建一个新的提交对象,包含与 125a1d1
相同的变更内容,更新当前分支(dev
)的引用和 HEAD
,使其指向这个新提交。
●(heads/dev) git cherry-pick 125a1d1 将提交 125a1d1 的变更应用到当前分支 dev 上
●(heads/dev) git cherry-pick release 将 release 分支的最新提交(即 heads/release)应用到 dev 分支上
●(heads/dev) git cherry-pick origin/release 将远程分支 origin/release 的最新提交(即 origin/release HEAD)应用到 dev 分支上
●(dev) git cherry-pick 125a1d1 125a2a1 将两个指定提交 125a1d1 和 125a2a1 分别应用到当前分支 dev 上
●(dev) git cherry-pick A..B 转移连续提交(不包含A)(提交A须早于提交B,否则命令将失败,但不会报错)
●(dev) git cherry-pick A^..B 转移连续提交(包含A) (提交A须早于提交B,否则命令将失败,但不会报错)
● git cherry-pick 125a1d1 -e 或 --edit 在应用提交后,打开编辑器让你修改提交信息
● git cherry-pick 125a1d1 -x 自动在提交信息末尾添加一行 (cherry picked from commit 125a1d1)
● git cherry-pick 125a1d1 -s 或 --signoff 在提交信息末尾追加签名行(如 Signed-off-by: Your Name <email>)
● git cherry-pick 125a1d1 -n 或 --no-commit 应用补丁但不创建新提交,只更新工作区和暂存区
● git cherry-pick -m 1 125a1d1 如125a1d是合并节点,cherry-pick将失败,因不知该用哪个分支的代码变动. 1和2的表示的分支A(2) merge into B(1)
●git cherry-pick发生冲突时 ☞ 会停下来让用户决定如何继续操作 ☞ 撤销cherry-pick:git cherry-pick --abort
●git cherry-pick发生冲突时 ☞ 会停下来让用户决定如何继续操作 ☞ 解决冲突,git add . && git cherry-pick --continue
●git cherry-pick 其他代码仓库代码