git cherry-pick命令:多个提交、冲突、取消、选项
本文将介绍git cherry-pick
命令。我们将介绍基础知识,如何使用它,如何处理多个提交,冲突管理,顺序,以及不同的选项。
1. 什么是git cherry-pick?
在Git中,偷梁换柱是指从一个分支复制一个或多个想要的提交,并将其插入另一个分支的过程。
这是一个非常强大的功能,取决于你如何使用它,但它也会使你的历史记录变得混乱。你可以用git cherry-pick
命令来做这件事。
特别是,git cherry-pick
命令用于诸如紧急bug修复,或在分支间同步部分代码。
否则,使用相对安全的方法,如git merge和git rebase是很好的做法,即使在协作的情况下。
是一个好的过程。
所以让我们先了解一下git cherry-pick
命令的用法,这样我们就可以在需要的时候立即使用它。
2. 使用cherry-pick的基本原理
使用git cherry-pick
命令是非常简单的。首先导航到你想添加提交的分支,然后输入你想从其他分支提取的提交ID,像这样
$ git cherry-pick [commit-id]
与该提交内容相同的提交将被登记为当前分支的新提交。
例如,假设你目前有如下的提交历史
A - B - C - D main
\ E - F - G feature-a
假设在 main
分支上发现了一个错误,一个在 feature-a
分支上工作的开发者向 feature-a
分支提交了一个 G
修复了这个错误。
这时,你需要将G提交到main
分支,以迅速恢复服务。
使用 git cherry-pick
命令来添加这个提交,如下所示。
$ git cherry-pick [commit-id-G]
之后,你的提交历史会是这样的
A - B - C - D - H main
\ E - F - G feature-a
这意味着所有来自G
提交的修改都被添加到名为H
的新提交中。
3. 挑选多个提交内容
有两种方法可以一次导入多个提交。
3.1. 挑拣
第一种方法是逐一输入提交内容。按如下方式逐一输入所需的提交ID。
$ git cherry-pick [commit-id-1] [commit-id-2] [commit-id-3]
这与您使用 git add 命令 添加多个文件和文件夹时的模式相同。在这种情况下,它们将被作为新的提交从前面添加。
3,2. 按范围导入
第二种方法是指定一个要导入的提交范围。你可以使用...
或者...
,cherry-picking对这两种情况一视同仁。
你可以使用类似这样的方法,在这种情况下,[older-commit-id]
将被排除,并从后面的提交开始复制。
$ git cherry-pick [older-commit-id]..[new-commit-id]
如果你想从我们在第2节看到的feature-a
分支拉出F
和G
的提交,你可以输入以下内容
$ git cherry-pick [commit-id-E]..[commit-id-G]
如果你想把[older-commit-id]
的提交也包括在内,你也可以使用^...
符号,这意味着下面的命令会产生与上面命令相同的结果。
$ git cherry-pick [commit-id-F]^..[commit-id-G]
4. 解决或取消cherry-pick的冲突
当你执行 git cherry-pick
时,你正在提交新的修改,这当然会带来冲突的可能性。
在这种情况下,你应该在继续进行cherry-pick之前手动解决冲突,就像合并或重构一样。
这个过程遵循的模式与重构相同。在你手动解决了冲突之后,你可以使用下面两个选项和命令来完成或取消偷梁换柱。
要想完成,请发布命令
$ git cherry-pick --continue
要放弃,使用以下命令
$ git cherry-pick --abort
5. 常用的选项
以下命令经常与git cherry-pick
命令一起使用。熟悉它们,并根据需要与该命令一起使用。
5.1. -n, --no-commit选项,用于等待而不提交
默认情况下,git cherry-pick
命令期望创建新的提交。
但有时,你想得到一个特定的提交,但在添加另一个改动后再提交。
要做到这一点,你需要cherry-pick
生成的提交和另一个提交。
在这种情况下,-n
或 --no-commit
选项很有用,因为它们不会提交由 cherry-pick
命令带来的修改,而是让它们处于暂存状态。
这使得你可以在不单独提交的情况下添加你想要的修改,然后一次性提交它们。
5.2. -改变提交信息的-e和-edit选项
通常情况下,git cherry-pick
命令会自动生成一个提交信息,看起来像这样
cherry-pick [commit-id] [commit-message-of-picked-commit]
如果你想打开一个编辑器来修改这个提交信息或添加更多信息,你可以使用-e
或--edit
选项。
5.3. --signoff选项,显示导入的提交的作者
如果你在一个开源项目上工作,或者在一个开源项目上合作,并且你在使用cherry-pick功能,你通常会有一个惯例来显示导入提交的author
。
在这种情况下,可以使用--signoff
选项来自动在提交信息中添加前次提交的 author
,而不必手动编写。
例如,如果你之前的提交信息是这样的
Implement new feature ABC
使用--signoff
选项的新提交的信息会自动写成如下所示。
Implement new feature ABC
Signed-off-by: Your Name [your.email@example.com]
5.4. 使用 --strategy 选项来指定合并策略
由于合并过程中可能出现冲突,cherry-pick
命令也允许你手动指定合并策略。
最常见的合并策略,包括当前默认的ort
策略,在git merge post的最后一节中进行了总结。
这些命令是
$ git cherry-pick --strategy [merge-strategy]
6. 总结
git cherry-pick
命令是一个强大的命令,当你在一个项目上工作,需要密切协作时,你可以随手拈来。
我希望你已经把它学好了,到时候可以使用它。
