对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。

这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用 合并(merge)。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 拣选(Cherry pick)。

通俗的讲 拣选 直接把某一次 提交 (commit)拿过来,作为最新一次提交,就像是直接摘了一颗樱桃加在链表最前面,所以叫Cherry pick (拣选)。

如果你感兴趣,可以从 Git 的底层来了解下拣选,如果不感兴趣,可以忽略这些内容。

git cherry-pick <commitHash>

该命令将指定的提交 commitHash 应用于当前分支。这会在当前分支产生一个新的提交,当然它们的哈希值会不一样。

举例来说,代码仓库有 masterfeature 两个分支。

a - b - c - d   Master
 \
     e - f - g  Feature

现在将提交 f 应用到 master 分支。

# 切换到 master 分支
$ git checkout master

# 拣选 操作
$ git cherry-pick f

上面的操作完成以后,代码库就变成了下面的样子。

a - b - c - d - f   Master
 \
     e - f - g      Feature

从上面可以看到,master分支的末尾增加了一个提交 f

git cherry-pick 命令的参数,不一定是提交的哈希值,分支名也是可以的,表示转移该分支的最新提交。

$ git cherry-pick feature

上面代码表示将 feature 分支的最近一次提交,转移到当前分支。

拣选的一般步骤

test-合并指定提交 分支中的某个提交应用到 master 分支的步骤如下:

  1. 切换到 master 分支:鼠标右键 -Tortoise Git - Switch/Checkout...,选择 master 分支。

  2. 打开 提交日志对话框,切换到 test-合并指定提交 分支,选中要 拣选 的某个提交或多个提交,然后右击鼠标弹出右键菜单,选择 Cherry Pick this commit...(选中一个提交)或 Cherry Pick select commits...(选中多个提交)。

在这里插入图片描述

  1. 这里选中 分支提交2,右击鼠标弹出右键菜单,选择 Cherry Pick this commit... 弹出 拣选 对话框。

在这里插入图片描述

拣选对话框与变基(Rebase)对话框很像。顶部窗口中每行显示一个选中的要 cherry-pick 的提交。顶部窗口下面的按钮控制操作,比如选取(Pick)提交、编辑、跳过等,还可以选择多个提交的顺序。

选中一行提交后,在底部窗口将显示受影响的文件。

  1. 选中要拣选的提交,单击 Continue 按钮。
  2. 如果没有冲突,在弹出的界面中按下 Done 按钮完成 拣选 操作。

注意:拣选可能产生合并冲突,在下面的 处理拣选冲突 中介绍如何解决冲突。

处理拣选冲突

1.在 拣选的一般步骤 一节中,最后的合并可能会有冲突。如果有冲突,在 Cherry Pick 对话框的底部窗口中会显示出冲突的文件:

在这里插入图片描述

  1. TortoiseGit会使用特定的图标标示出冲突的文件:

    在这里插入图片描述

  2. 选中冲突文件,在右键菜单中选择 TortoiseGit - Edit Conflicts 启动外部合并工具/冲突编辑器手动解决冲突。

在这里插入图片描述
这里 CHERRY_PICK_HEAD(77c84bf9) 是我们要合并的源文件,与 Base 文件相比较可以看出新增加了一个内容为 “分支提交5” 的提交,这个提交是我们要拣选到主分支( HEAD 指向的文件)的提交。
4. 手动编辑冲突,需要把 “分支提交5” 内容拷贝到主分支(HEAD指向的文件),然后保存:

在这里插入图片描述
5. 手动修改冲突文件后,执行 TortoiseGit - Resolve... 菜单项,在弹出的对话框中点击 OK按钮,将刚刚修改的冲突文件标记为 冲突已解决(resolve)
在这里插入图片描述
7. 标记为冲突已解决后,TortoiseGit弹出下一步操作界面。正常的合并冲突流程需要做一次提交,填写本次冲突解决的信息,但我们这里是拣选合并,并不需要手动做一次提交,所以这里点击OK按钮,而不要点Commit...按钮!(这是与普通合并冲击解决流程的唯一区别)。

在这里插入图片描述
8. 回到拣选对话框,在底部窗口按下 F5 快捷键刷新显示内容,可以看到文件已经不是冲突状态。这时按下 Commit 按钮,让 TortoiseGit 自动做一次提交。注意这次提交并不需要你填写什么信息,TortoiseGit 会把拣选的提交信息搬运到这次提交中。

在这里插入图片描述
8. 自动完成一次提交后,按下 Done 按钮完成 拣选 操作。

在这里插入图片描述









读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)
千金难买知识,但可以买好多奶粉

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐