Git
git cherry-pick

git cherry-pick命令:多个提交、冲突、取消、选项

本文将介绍git cherry-pick命令。我们将介绍基础知识,如何使用它,如何处理多个提交,冲突管理,顺序,以及不同的选项。

1. 什么是git cherry-pick?

在Git中,偷梁换柱是指从一个分支复制一个或多个想要的提交,并将其插入另一个分支的过程。 这是一个非常强大的功能,取决于你如何使用它,但它也会使你的历史记录变得混乱。你可以用git cherry-pick命令来做这件事。

特别是,git cherry-pick命令用于诸如紧急bug修复,或在分支间同步部分代码。 否则,使用相对安全的方法,如git mergegit 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分支拉出FG的提交,你可以输入以下内容

$ 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命令是一个强大的命令,当你在一个项目上工作,需要密切协作时,你可以随手拈来。 我希望你已经把它学好了,到时候可以使用它。

copyright for git cherry-pick

© 2023 All rights reserved.