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

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

选择要合并到当前分支的分支,点击 修改选项 ,然后从以下选项中选择:
--no-ff:无论是否可以进行快速前移合并,都会创建一个合并提交。--ff-only:仅在可以快速前移时才会完成合并。--squash:将在当前分支顶部创建一个包含所有拉取更改的单一提交。-m:您可以编辑合并提交的消息。--no-commit:将执行合并操作,但不会创建合并提交,以便您在提交前检查合并结果。--no-verify:执行合并操作时,将跳过默认运行的预合并和提交消息钩子。--allow-unrelated-histories:执行合并操作,同时绕过拒绝合并没有共同祖先的历史记录的安全规则。
点击 合并。
如果您的工作区是干净的(即没有未提交的更改),并且功能分支与目标分支之间没有冲突,Git 会合并这两个分支,合并提交将显示在 日志 选项卡中的 Git 工具窗口内 Alt+9。

如果您的分支与目标分支之间存在冲突,系统会提示您解决这些冲突(请参阅 解决冲突)。 如果合并后仍存在未解决的冲突, 合并冲突 节点将在 提交 工具窗口中相应的更改列表中显示 Alt+0 ,并带有一个链接用于解决冲突。
如果有本地更改将被合并覆盖,WebStorm 将建议执行 智能合并。 如果您选择该选项,WebStorm 将 储藏 未提交的更改,执行合并,然后还原这些更改。
变基分支(git-rebase)
将一个分支 rebase 到另一个分支时,表示您将第一个分支的提交应用到第二个分支中 HEAD 提交之后。
假设您创建了一个功能分支来处理某项任务,并在该分支上进行了多次提交(F1、 F2、 F3):
当您在分支中进行开发的同时,您的团队成员继续将其工作提交到 main (C4、 C5):
要将团队成员所做的更改(C4、 C5 )集成到您的功能分支中,您可以将该分支 变基 到 main。 通过此操作,您将把自己的提交应用到 main 中当前 HEAD 提交之后:
变基的主要优势在于,您可以获得一份干净的项目历史记录,便于他人阅读和理解。 您的日志中不会包含由 merge 操作生成的不必要合并提交,历史记录呈线性结构,更便于浏览和检索。
但在决定采用此工作流时,您应注意 rebase 会重写项目历史记录,因为它会为原始功能分支中的每个提交创建新的提交(使用 F1' 代替 F1 ),因此这些提交将具有不同的哈希值,从而降低可追溯性。
将一个分支变基到另一个分支上
在主菜单中选择
从列表中选择要将当前分支变基到其上的目标分支:

如果需要从特定提交开始变基源分支,而不是变基整个分支,请点击 修改选项 并选择 --onto。

在源分支字段中输入要从该提交开始将当前分支应用到新基准的提交哈希:

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

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

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

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

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

您可以对分支历史执行以下更改:
更改提交顺序 :使用
和
按钮在列表中上下移动提交。
选择提交 :这是所有提交的默认状态。 如果您需要撤消已对提交执行的操作,请单击 选中
,使该提交保持原样应用。
编辑 :单击 停止并编辑
,这样在开始变基时,操作将暂停于该提交,允许您对其进行编辑。

当变基暂停于某个提交时,WebStorm 窗口右下角将弹出通知,允许您继续或中止变基:

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

单击 开始变基。
编辑分支历史并将其集成到其他分支中
WebStorm 允许您将一个分支 变基 到另一个分支之上,并在应用更改之前编辑源分支历史记录。
从主菜单中选择
单击 修改选项 ,然后选择 --interactive。
在列表中选择要将当前分支变基到其上的目标分支:

如果需要从特定提交开始变基源分支,而不是变基整个分支,请单击 修改选项 并选择 --onto。

在源分支字段中输入从该提交开始要将当前分支应用到新基准的提交哈希:

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

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

您可以对分支历史执行以下更改:
更改提交顺序 :使用
和
按钮在列表中上下移动提交。
选择提交 :这是所有提交的默认状态。 如果需要撤销已对提交执行的操作,请单击 选中
,以便按原样应用此提交。
编辑 :单击 停止并编辑
,以便在开始变基时暂停于此提交并进行编辑。

当变基在某个提交处暂停时,WebStorm 窗口右下角会弹出通知,允许您继续或中止变基操作:

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

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

将提交应用到另一个分支
在 分支 弹出窗口(主菜单 )中,选择要集成更改的目标分支,并在弹出菜单中选择 签出 切换到该分支。
打开 Git 工具窗口 Alt+9 ,并切换到 日志 选项卡。
定位包含您要 cherry-pick 更改的提交。
您可以按分支、用户或日期筛选提交。 您还可以点击工具栏上的
,并选择 高亮显示 | 未挑选的提交 选项以灰显已应用到当前分支的提交。 如果您知道提交哈希,或者正在查找带标签的提交,您也可以使用 转到哈希/分支/标签 操作(在 Git 工具窗口 Alt+9 的 日志 选项卡中按 Ctrl+F ,或点击工具栏上的
)。
选择所需的提交。 请根据 提交详细信息 区域中的信息确定这些是您希望传送到另一个分支的更改。
点击工具栏上的 Cherry-pick
。 WebStorm 将把更改应用并提交到目标分支。
如果 cherry-pick 失败并产生冲突,所选更改将出现在 更改 区域,您可以在 提交 工具窗口中的 Alt+0 看到。 您可以查看这些更改,并在需要时稍后提交。
如果您希望在 cherry-pick 失败时,WebStorm 自动创建更改列表,请在 中启用相应的设置。
将更改推送到目标分支。
以下视频可帮助您了解 cherry-pick 的工作方式:
应用单独更改
假设您对文件进行了某些更改,想要将其应用到另一个分支,但这些更改是与其他修改的文件一起提交的。 WebStorm 允许您应用单独的更改,而不是 cherry-pick 整个提交。
在 分支 弹出窗口(主菜单 )中,选择要集成更改的目标分支,并在弹出菜单中选择 签出 切换到该分支。
打开 Git 工具窗口 Alt+9 ,并切换到 日志 选项卡。
定位包含您要应用更改的提交。
您可以按分支、用户或日期筛选提交。 您还可以点击工具栏上的
,并选择 高亮显示 | 未挑选的提交 选项以灰显已应用到当前分支的提交。 如果您知道提交哈希,或者正在查找带标签的提交,您也可以使用 转到哈希/分支/标签 操作(在 Git 工具窗口 Alt+9 的 日志 选项卡中按 Ctrl+F ,或点击工具栏上的
)。
在右侧的 提交详细信息 窗格中,选择包含要应用到目标分支的更改的文件,并从上下文菜单中选择 Cherry-pick 所选更改。
在打开的对话框中,选择一个已有的变更列表或输入一个新变更列表的名称,然后点击 确定。
提交更改,然后将其推送到目标分支。
应用单个文件
除了将单个文件的独立更改应用到目标分支,您还可以将整个文件的内容复制到其他分支。 例如,如果目标分支中不存在您要应用的文件,或者该文件的更改分布在多个提交中,这种方式可能会非常有用。
