Git 中提交同一更改至多个分支
Git 中提交同一更改至多个分支
2023年7月29日
摘要
在使用 Git 管理项目时,时常会为不同的细分需求创建多个不同的分支,然而有时某些类似修复 Bug 的更改是需要同时应用于多个分支的。此时,如果简单粗暴的切换至不同的分支分别进行更改,无疑是非常低效的,尤其是更改涉及多个文件时。本文提供了两种不同的方式可以将同一个更改应用于多个分支。
git cherry-pick
Git 自带了一个名为 cherry-pick 的工具,可以像他的名字一样,挑选某一分支的某些 commit 并将其应用于自身。
使用 cherry-pick 的方案时,我们需要先把目标更改在某一分支完成并提交,此时使用 git checkout
切换至其他同样需要应用此更改的分支,然后使用命令:
git cherry-pick COMMIT_ID
将选中更改应用于此分支。
对于 COMMIT_ID
选项,有一些常用选项:
COMMIT_ID
- 选中单一 commitCOMMIT_ID_1 COMMIT_ID_1
- 选中多个 commitSTART_COMMIT_ID...END_COMMIT_ID
- 一个阶段内的所有 commit,左开右闭,不包括开头,包括结尾START_COMMIT_ID^..END_COMMIT_ID
- 一个阶段内的所有 commit,左闭右闭,包括开头和结尾
注意,cherry-pick 的操作时,有可能两个分支的内容会出现冲突,如 Git 无法自动完成合并,则可能需要手动解决冲突,具体的方法在我的另一篇文章中有教程。
新建 Feature 分支
使用 cherry-pick 的方式,可能在某些维度来看会比较奇怪,因为这样的操作会选择一个分支直接更改,而其他分支是应用此分支中的某些更改,把修复同一 bug 的,本应所有分支都平级的操作显得好像分支在此项更改中有主次之分。虽然看似这样有点故意挑刺的意味,但在某些哲学层面,一些比较有追求的开发者并不太喜欢这样的方式,不够完美。因此,还有另一种方式:新建一个分支进行更改,并在所有其他分支中进行 merge 操作。
为了更快捷的完成我们的工作,我们首先需要找到这些分支的最近的共同祖先,也就是他们开始分叉的地方,使用以下命令即可轻松完成:
git merge-base COMMIT_ID_1 COMMIT_ID_2 COMMIT_ID_3 ... COMMIT_ID_n
即可得到他们的共同祖先。
在保存每一个分支的更改后,假设上一步骤我们得到的共同祖先的 ID 是 a1b2c3d
(Git 中 commit ID 一般使用前 7 位即可,最少 4 位),那我们使用以下命令即可回到他们的共同祖先:
git checkout a1b2c3d
此后,在此节点使用以下命令创建并直接切换到新的更改 bug 或是添加 feature 的分支:
git checkout -b NAME
此操作等效于先使用 git branch NEW
创建分支再 git checkout NEW
切换分支。
在此分支上完成更改并提交后,重新切换回每一个要应用此更改的分支,并使用以下命令合并更改:
git merge NEW
即可在每个分支上应用此更改。
如果不想保留这个新的临时分支,可以使用以下命令在本地删除:
git brancd -d NEW
或是从远程删除:
git push origin -d NEW