合并、变基或拣选以应用更改
在 Git 中,有几种方式可以将一个分支的更改集成到另一个分支中:
合并分支
假设您已创建一个功能分支用于处理某个特定任务,并希望在该功能完成并通过测试后将工作成果(F1、 F2、 F3 )集成到主代码库中:
合并您的分支到 main 是最常见的方式。
通常,在您处理功能分支时,您的团队成员会继续将他们的工作提交到 main (C4、 C5):
当您将功能分支 合并到 main 时,分支中的更改将被集成到目标分支的 HEAD 中:
Git 会创建一个新的提交,称为合并提交,该提交将功能分支与 main 自两个分支分叉点以来的更改合并在一起。
合并的主要优势是完全可追溯性,因为合并到 main 代码库的提交保留其原始哈希和作者,且所有属于一个功能的提交可被分组显示。
此工作流程适用于将更改提交到 main 代码库需要 拉取或 合并请求 、或级联审批流程的项目,因为不会改变已有的分支。
此方法的主要缺点是,每次集成更改时都会创建额外的合并提交,严重污染项目历史记录,导致难以阅读。
合并分支
在 分支 弹出窗口(主菜单 )或 分支 工具窗口的 Git 面板中,选择要集成更改的目标分支,并在上下文菜单中选择 签出 切换到该分支。
请执行以下任一操作:
如果不需要指定合并选项,请选择要合并到当前分支的分支,并从子菜单中选择 将 <branch_name> 合并到 <target_branch>。

如果需要指定合并选项,请在主菜单中选择 以打开 合并 对话框:

选择要合并到当前分支的分支,点击 修改选项 并从以下选项中选择:
--no-ff:无论是否可以快进合并,都会创建一个合并提交。--ff-only:仅当可以快进合并时,才会执行合并操作。--squash:一个包含所有拉取更改的单一提交将被创建在当前分支之上。-m:您将能够编辑合并提交的信息。--no-commit:将执行一次合并,但不会创建合并提交,以便在提交前检查合并结果。--no-verify:执行合并时将绕过默认运行的 pre-merge 和 commit-message 钩子。--allow-unrelated-histories:执行合并时会覆盖不允许合并无共同祖先历史的安全规则。
单击 合并。
如果您的工作区是干净的(即没有未提交的更改),且功能分支与目标分支之间没有冲突,Git 将合并两个分支,并且该合并提交将出现在 日志 选项卡中的 Git 工具窗口 Alt+9 中:

如果您的分支与目标分支之间发生冲突,将提示您解决这些冲突(请参阅 解决冲突)。 如果在合并后仍存在未解决的冲突, 合并冲突 节点将出现在 提交 工具窗口中相应变更列表内 Alt+0 ,并附有解决链接。
如果合并操作将覆盖本地更改,GoLand 将建议执行 智能合并。 如果您选择此选项,GoLand 将 stash 未提交的更改,执行合并,然后还原这些更改。
变基分支(git-rebase)
当您将 rebase 分支应用到另一个分支时,您会将第一个分支中的提交应用到第二个分支中 HEAD 提交之上。
假设您已创建一个功能分支以处理特定任务,并在该分支上进行了多次提交(F1、 F2、 F3):
在您于自己的分支上开发的同时,其他团队成员继续将他们的工作(C4、 C5 )提交到 main:
为了将团队成员所做更改(C4、 C5 )集成到您的功能分支中,您可以将分支 rebase 到 main。 通过这样做,您会将自己的提交应用到 main 中当前 HEAD 提交之上:
rebase 的主要好处在于可以获得结构清晰、便于他人阅读和理解的项目历史。 您的日志不会包含由 merge 操作生成的不必要合并提交,并且获得线性的历史记录,便于导航和搜索。
在决定采用此工作流时,您应注意: rebase 会重写项目历史,在原始功能分支中的每个提交都创建新的提交(F1' 替代 F1 ),因此提交哈希将不同,这会影响可追溯性。
将一个分支变基到另一个分支上
从主菜单中选择

从列表中选择要将当前分支 rebase 到的目标分支:

如果需要从特定提交开始而不是对整个源分支进行 rebase,请单击 修改选项 并选择 --onto。
在源分支字段中,输入要从其开始将当前分支应用到新基础的提交哈希:

如果要 rebase 的分支当前未检出,请单击 修改选项 ,再单击 选择另一个分支进行变基 ,然后从出现的列表中选择一个分支:

GoLand 会在开始 rebase 操作前检出该分支。
根据您的具体情况,从 修改选项 列表中选择其他选项:
--rebase-merges:保留提交中的分支结构,这些提交将被 rebase。请注意,这些合并提交中已解决的冲突或手动修改需要手动重新解决或重新应用。
--keep-empty:保留空提交,即未更改其父提交内容的提交。--root:rebase 分支中所有可达的提交。--update-refs:自动强制更新指向正在 rebase 的提交的任何分支。
单击 变基。
如果不需要为 rebase 指定选项,可以在不打开 rebase 对话框的情况下启动 rebase 操作。 在 分支 弹出菜单或 分支面板 中的 Git 工具窗口中选择一个分支,并选择以下操作之一:

切换并变基到 <current_branch_name> (适用于远程和本地分支):检出所选分支并将其 rebase 到当前检出的分支之上。 如果远程分支在本地不存在,GoLand 将自动创建一个本地跟踪分支,检出并进行 rebase。
将 <current_branch_name> 变基到 <selected_branch_name> (适用于远程和本地分支):将当前检出的分支 rebase 到所选分支之上。
使用变基拉取到 <current_branch_name> (适用于远程分支): fetch 所选分支的更改并将当前分支 rebase 到这些更改之上。
观看此视频以更好地了解如何执行 rebase 操作:
通过执行交互式变基编辑 Git 历史记录
借助 GoLand 中的 Git 集成,您可以执行 interactive rebase 来编辑提交历史,使其更为线性且易于理解。 这使您能够在将更改从功能分支集成到其他分支之前,通过修改提交、调整顺序、压缩为一个提交、跳过无关更改等操作来清理提交历史。
编辑当前分支的历史记录
GoLand 允许您在将更改应用到其他分支之前编辑当前分支的提交历史。
打开 Git 工具窗口 Alt+9 并切换到 日志 选项卡。
筛选日志,使其仅显示当前分支的提交:

选择您要编辑的提交序列中最早的提交,右键单击它并选择 从此处交互式变基。
将显示 交互式变基 对话框,其中包含当前分支中在所选提交之后创建的所有提交的列表:

如果 从此处交互式变基 选项被禁用,可能原因如下:
所选提交有多个父项
所选提交不在当前分支中
所选提交已推送到 受保护的分支
要确定原因,请将鼠标悬停在上下文菜单中的操作上,并在状态栏中查看消息:

您可以对分支历史记录执行以下更改:
更改应用提交的顺序 :使用
和
按钮上下移动提交。
选择提交 :这是所有提交的默认状态。 如果需要撤销对某个提交已执行的操作,请单击 选取
,以按原样应用该提交。
编辑 :单击 停止以编辑
,以便在开始变基时停留在此提交处进行编辑。
当变基在某个提交处停止时,GoLand 窗口的右下角会弹出通知,允许您继续或中止变基操作:

您可以在继续变基之前使用上下文操作(如 还原、 撤销、 修订 等)修改此提交。 如果您未执行任何操作,将按原样应用此提交。
如果您已关闭通知,请从主菜单选择 Git | 继续变基 来恢复操作。
修改提交说明 :点击 重写提交信息 或双击提交,在打开的迷你编辑器中编辑文本。
将两个提交合并为一个 :选择要合并到前一个提交中的提交,单击 压缩提交 或 压缩提交 按钮旁的箭头,然后选择 修正提交。
如果单击 压缩提交 ,默认情况下将合并两个提交的说明,如果您未修改合并后的提交说明,该操作将体现在分支历史中。
如果单击 修正提交 ,其提交说明将被舍弃,因此该更改在分支历史中不可见。
在这两种情况下,您都可以在应用其中一种操作后在打开的迷你编辑器中编辑提交说明。
忽略提交 :点击 删除提交 ,则所选提交中的更改不会被应用。
撤销所有更改 :点击 重置 以放弃您对提交执行的所有操作。
最终, 变基提交 对话框将显示一张图,展示您在分支中对提交所做的所有操作,以便在开始变基前进行查看:

点击 开始变基。
编辑一个分支的历史并将其集成到另一个分支中
GoLand allows you to rebase a branch on top of another branch and edit the source branch history before you apply the changes.
从主菜单选择

点击 修改选项 并选择 --interactive。
从列表中选择要将当前分支变基到其上的目标分支:

如果您需要从特定提交开始对源分支进行变基,而不是变基整个分支,请点击 修改选项 并选择 --onto。
在源分支字段中输入您希望将当前分支应用于新基准的起始提交的哈希值:

如果要变基的分支当前未检出,请点击 修改选项 ,再点击 选择另一个分支进行变基 ,并在出现的列表中选择一个分支:

GoLand 在开始变基操作前会检出该分支。
根据您的具体情况,从 修改选项 列表中选择其他选项:
--rebase-merges:保留要变基的提交中的分支结构。请注意,这些合并提交中任何已解决的合并冲突或手动修改都必须手动重新解决或重新应用。
--keep-empty:保留空提交,即不对其父提交做任何更改的提交。--root:变基在分支中可以访问的所有提交。--update-refs:自动强制更新指向正在变基的提交的任何分支。
点击 变基。
将显示 交互式变基 对话框,其中包含当前分支中在所选提交之后创建的所有提交的列表。

您可以对分支历史记录执行以下更改:
更改应用提交的顺序 :使用
和
按钮上下移动提交。
选择提交 :这是所有提交的默认状态。 如果需要撤销对某个提交已执行的操作,请单击 选取
,以按原样应用该提交。
编辑 :单击 停止以编辑
,以便在开始变基时停留在此提交处进行编辑。
当变基在某个提交处停止时,GoLand 窗口的右下角会弹出通知,允许您继续或中止变基操作:

您可以在继续变基之前使用上下文操作(如 还原、 撤销、 修订 等)修改此提交。 如果您未执行任何操作,将按原样应用此提交。
如果您已关闭通知,请从主菜单选择 Git | 继续变基 来恢复操作。
重写提交消息 :点击 重写提交信息 或双击一个提交,并在打开的迷你编辑器中编辑其文本。
将两个提交合并为一个 :选择要合并到前一个提交中的提交,然后点击 压缩提交 或 压缩提交 按钮旁的箭头,再点击 修复提交。
如果您点击 压缩提交 ,默认情况下两个提交的消息将被合并,因此如果您未修改生成的提交消息,此操作将会反映在分支历史中。
如果您点击 修复提交 ,fixup 提交的提交消息将被丢弃,因此此更改在分支历史中将不可见。
在这两种情况下,您都可以在应用其中一个操作时打开的迷你编辑器中编辑提交消息。
忽略提交 :点击 丢弃 ,以使所选提交中的更改不被应用。
撤销所有更改 :点击 重置 以放弃您对提交所应用的所有操作。
结果是, 变基提交 对话框显示了一个图表,说明您在分支上所应用的所有提交操作,以便在开始 rebase 前进行查看:

点击 开始变基。
拣选单独提交
有时,您只需将单个提交应用到另一个分支,而无需 rebase 或合并整个分支。 例如,如果您正在功能分支中工作,并希望集成来自 main 的 hotfix,而该 hotfix 是在两个分支出现分歧之后提交的,这种操作可能会很有用。 或者,您希望将修复补丁回移到之前的发布分支。 您可以使用 变基摘取 操作来实现此目的。
cherry-pick 操作的状态将显示在状态栏中。 您可以随时在 Git 分支 弹出窗口中选择 中止优选 以中止正在进行的 cherry-pick 操作。

将提交应用到另一个分支
在 分支 弹出窗口(主菜单 )中,选择要集成更改的目标分支,并从弹出菜单中选择 签出 以切换到该分支。
打开 Git 工具窗口 Alt+9 并切换到 日志 选项卡。
定位包含您想要 cherry-pick 的更改的提交。
您可以按分支、用户或日期筛选提交。 您还可以点击工具栏上的
并选择 高亮显示 | 未摘取提交 选项,以将当前分支中已应用的提交置灰。 If you know the commit hash, or are looking for a tagged commit, you can also use the 转到 Hash/分支/标签 action (press Ctrl+F in the 日志 tab of the Git tool window Alt+9, or click
on the toolbar).
选择所需的提交。 使用 提交详情 区域中的信息,以确保这些是您想要转移到另一分支的更改。
点击工具栏上的 变基摘取
。 GoLand 会将更改应用并提交到目标分支。
如果 cherry-pick 因冲突而失败,所选更改将显示在 更改 区域中,您可以在 提交 工具窗口 Alt+0 中看到它。 您可以查看这些更改,并在必要时稍后提交。
如果您希望 GoLand 在 cherry-pick 失败时自动创建变更列表,请在 中启用相应设置。
将更改推送到目标分支。
以下视频将帮助您了解 cherry-pick 的工作方式:
应用单独更改
假设您对某个文件进行了更改,并希望将这些更改应用到另一个分支,但这些更改是与其他修改文件一起提交的。 GoLand 允许您应用单独的更改,而不是 cherry-pick 整个提交。
在 分支 弹出窗口(主菜单 )中,选择要集成更改的目标分支,并选择 签出 切换到该分支。
打开 Git 工具窗口 Alt+9 并切换到 日志 选项卡。
定位包含您想要应用的更改的提交。
您可以按分支、用户或日期筛选提交。 您还可以点击工具栏上的
并选择 高亮显示 | 未摘取提交 选项,将当前分支中已应用的提交置灰。 If you know the commit hash, or are looking for a tagged commit, you can also use the 转到 Hash/分支/标签 action (press Ctrl+F in the 日志 tab of the Git tool window Alt+9, or click
on the toolbar).
在右侧的 提交详细信息 面板中,选择包含您要应用到目标分支更改的文件,然后在上下文菜单中选择 变基摘取所选更改。
在打开的对话框中,选择一个现有的变更列表,或输入新变更列表的名称,然后点击 确定。
提交更改,然后将其推送到目标分支。
应用单独文件
除了将单独的更改应用到某个文件外,您还可以将整个文件的内容复制到另一个分支。 例如,当目标分支中不存在要应用的文件,或者该文件的更改分布在多个提交中时,这可能会很有用。
切换到将应用更改的分支。
在 分支 弹出窗口(主菜单 )或 分支 选项卡中的 Git 工具窗口中,选择包含要应用文件的分支,并从上下文菜单中选择 显示与工作树的差异。
打开的 更改 工具窗口显示在所选分支与当前签出的分支之间不同的所有文件列表:
所选分支中存在但当前分支中缺失的文件将以灰色标记。
当前分支中存在但在所选分支中缺失的文件将以绿色标记。
在所选分支与当前分支之间存在差异的文件将以蓝色标记。
您可以点击 交换分支 链接来更改用于比较的基准分支。
选择要应用到当前分支的文件,然后从上下文菜单中选择 从分支获取 ,或点击工具栏上的
。
提交并推送更改。 GoLand 会将该文件的完整内容复制到当前分支。