彭某的技术折腾笔记

彭某的技术折腾笔记

Git 中提交同一更改至多个分支

23
2023-07-30

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 - 选中单一 commit
  • COMMIT_ID_1 COMMIT_ID_1 - 选中多个 commit
  • START_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
  • 0