git工具-8-cherrypick
什么是cherry-pick?
cherry-pick
是一个强大的Git命令,用于将一个或多个其他分支的提交应用到当前分支。这个命令让你能够选择性地拾取某个分支上的提交(即”樱桃挑选”或"拣选"),而不是通过合并或重置操作引入整个分支的更改。
git 中的cherry-pick
类似于对特定的某次提交的变基。 它会提取该提交的补丁,之后尝试将其重新应用到当前分支上。
使用场景
-
当你想将一个特定的修复从一个分支(如
main
)应用到另一个分支(如发布分支)时,而不需要引入中间的所有提交。 -
在处理大型项目时,如果只需要某个分支上的一个小更改而不是整个分支的合并。
-
在回滚特定的提交时,可以用于将该提交的反向更改应用到当前分支上。
基本用法
pick单个提交
假设我们有如下的提交历史:
1 | MINGW64 /d/tmp/git-playground (ruby_client) |
如果你希望将提交e43a6
拉取到 master
分支,你可以运行如下命令:
首先查看该次提交的内容:
1 | $ git show 9f671cd |
此次的改动内容:往index.html
文件中添加了一行<!DOCTYPE>
,然后切换到master
分支,执行如下命令:
1 | MINGW64 /d/tmp/git-playground (ruby_client) |
执行完成cherry-pick
后,查看仓库的状态:
1 | MINGW64 /d/tmp/git-playground (master) |
提交e43a6
的变动内容已经合并到master
分支,此时查看git log
:
1 | MINGW64 /d/tmp/git-playground (master) |
这样会拉取和 e43a6
相同的更改,但是因为应用的日期不同,你会得到一个新的提交 SHA-1 值。现在你的历史会变成这样:
pick多个提交
-
多个提交:可以连续列出多个提交哈希值,也可以使用范围操作符,如
git cherry-pick startHash^..endHash
,这将拾取从startHash
到endHash
之间的所有提交(包括endHash
,但不包括startHash
)。
注意事项
-
冲突:
git cherry-pick
可能会引起冲突,就像合并操作一样。如果发生冲突,Git会停止应用提交,让你解决冲突。解决后,你需要使用git cherry-pick --continue
来继续应用提交。 -
选择性地引入更改:虽然
cherry-pick
提供了高度的选择性,但它也可能导致分支历史混乱,尤其是当被拾取的提交依赖于其他未被拾取的更改时。