0011-Git不完全操作指南之本地操作7——cherry-pick

23 阅读3分钟

前言

相信之前文章中所讲的 一些git命令已经能够覆盖绝大部分工作场景的情况了。但不知道你又没有遇到类似的一些情况:“我想要把这个提交放到这里, 那个提交放到刚才那个提交的后面”。面临这样的提交记录整理的问题,我们要如何解决呢?

cherry-pick

 git cherry-pick, 命令形式为:

  • git cherry-pick <提交号>...

如果你想将一些提交复制到当前所在的位置(HEAD)下面的话, Cherry-pick 是最直接的方式了。

图示

如下图,如果我们想要把下图中的C2C4两个提交放到main分支上

cherry-pick

# 请注意,我们当前分支就是main分支,因此不需要切换,如果当前分支不是目标分支
# 记得先切换到目标分支
git cherry-pick C2 C4

我们只需要提交记录 C2C4,所以 Git 就将被它们抓过来放到当前分支下了。 就是这么简单!

cherry-pick2

当你知道你所需要的提交记录(并且还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了 —— 没有比这更简单的方式了。

但是如果你不清楚你想要的提交记录的哈希值呢? 幸好 Git 帮你想到了这一点, 我们可以利用交互式的 rebase —— 如果你想从一系列的提交记录中找到想要的记录, 这就是最好的方法了。

交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i

如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。

在实际使用时,所谓的 UI 窗口一般会在文本编辑器 —— 如 Vim —— 中打开一个文件。

当 rebase UI界面打开时, 你能做3件事:

  • 调整提交记录的顺序
  • 删除你不想要的提交
  • 合并提交,它允许你把多个提交记录合并成一个。

cherry-pick

例如上述的一个分支,如果我们执行以下命令会怎样呢?

git rebase -i HEAD~4
# 会出来一个可视化编辑器,如vim,你可以在其中对提交记录进行删除、修改、调整顺序等
# 这边进行的操作是删除C4提交的记录,并按照C5、C3、C2的顺序提交

cherry-pick

最终的结果就是上面这样。大家一定和好奇,所谓的可视化编辑界面是怎样的呢?这边给一个vim的示例:

cherry-pick5

大家可以看到,我们这里可以看到我们要rebase的几次提交记录的哈希提交说明,而前面的pick代表要执行的命令。可以根据下面注释的命令详解,根据不同的场景需求选择不同的命令。

结语

有了cherry-pick命令之后,我们就可以更加灵活的挑选和优化我们的提交记录,让他们变得更加竟然有序。