对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。
这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用 合并
(merge)。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 拣选
(Cherry pick)。
通俗的讲 拣选
直接把某一次 提交
(commit)拿过来,作为最新一次提交,就像是直接摘了一颗樱桃加在链表最前面,所以叫Cherry pick
(拣选)。
如果你感兴趣,可以从 Git 的底层来了解下拣选,如果不感兴趣,可以忽略这些内容。
git cherry-pick <commitHash>
该命令将指定的提交
commitHash
应用于当前分支。这会在当前分支产生一个新的提交,当然它们的哈希值会不一样。举例来说,代码仓库有
master
和feature
两个分支。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
分支的步骤如下:
-
切换到 master 分支:
鼠标右键 -Tortoise Git - Switch/Checkout...
,选择master
分支。 -
打开
提交日志对话框
,切换到test-合并指定提交
分支,选中要拣选
的某个提交或多个提交,然后右击鼠标弹出右键菜单,选择Cherry Pick this commit...
(选中一个提交)或Cherry Pick select commits...
(选中多个提交)。
- 这里选中
分支提交2
,右击鼠标弹出右键菜单,选择Cherry Pick this commit...
弹出拣选
对话框。
拣选对话框与变基(Rebase)对话框很像。顶部窗口中每行显示一个选中的要 cherry-pick 的提交。顶部窗口下面的按钮控制操作,比如选取(Pick)提交、编辑、跳过等,还可以选择多个提交的顺序。
选中一行提交后,在底部窗口将显示受影响的文件。
- 选中要拣选的提交,单击
Continue
按钮。 - 如果没有冲突,在弹出的界面中按下
Done
按钮完成拣选
操作。
注意:拣选可能产生合并冲突,在下面的 处理拣选冲突
中介绍如何解决冲突。
处理拣选冲突
1.在 拣选的一般步骤
一节中,最后的合并可能会有冲突。如果有冲突,在 Cherry Pick 对话框的底部窗口中会显示出冲突的文件:
-
TortoiseGit会使用特定的图标标示出冲突的文件:
-
选中冲突文件,在右键菜单中选择
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
按钮完成 拣选
操作。
读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)