通过合并、变基或拣选来应用更改
在 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 中相应的更改列表中,并提供用于解决它们的链接。
如果您有会被合并覆盖的本地更改,PyCharm 将建议执行 智能合并。 如果您选择此选项,PyCharm 将 贮藏 未提交的更改,执行合并,然后取消贮藏这些更改。
变基分支(git-rebase)
当您将一个分支 rebase 到另一个分支时,您会把第一个分支的提交应用到第二个分支的 HEAD 提交之上。
假设您已创建一个功能分支来处理特定任务,并向该分支进行了多次提交(F1、 F2、 F3):
当您在分支中开发时,队友会继续将他们的工作(C4、 C5 )提交到 main:
要将队友所做的更改(C4、 C5 )集成到您的功能分支中,您可以将分支 变基到 main 之上。 这样,您会将自己的提交应用到 main 中当前的 HEAD 提交之上:
变基的主要好处是,您可以获得干净的项目历史,便于他人阅读和理解。 您的日志不包含由 merge 操作产生的不必要的合并提交,从而获得便于导航和搜索的线性历史。
不过,在决定采用此工作流时,您应注意, rebase 会重写项目历史,因为它会为原始功能分支中的每个提交创建新的提交(F1' 而非 F1 ),因此它们将具有不同的哈希,这会影响可追溯性。
将分支变基到另一个分支之上
在主菜单中选择

在列表中,选择要将当前分支变基到的目标分支:

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

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

PyCharm 会在开始变基操作之前检出此分支。
根据您的具体情况,从 修改选项 列表中选择其他选项:
--rebase-merges:保留待变基提交中的分支结构。请注意,这些合并提交中已解决的合并冲突或手动更改需要手动重新解决或重新应用。
--keep-empty:保留空提交,即相对于其父项没有任何更改的提交。--root:变基分支中可达的所有提交。--update-refs:自动强制更新所有指向正在变基的提交的分支。--autosquash:自动压缩标记为 fixup 或 squash 的提交。
点击 变基。
如果无需为变基指定选项,您可以在不打开变基对话框的情况下启动变基。 在 分支 弹出窗口中,或在 Git 工具窗口的 分支窗格 中,选择一个分支,并选择以下操作之一:

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

选择您要编辑的一系列提交中最旧的提交,右键点击并选择 从此处开始交互式变基。
交互式变基 对话框将显示,包含当前分支中在所选提交之后所做的所有提交列表:

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

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

您可以修改此提交使用上下文操作(例如 还原、 撤销、 修订 等,然后继续变基。 如果您不执行任何操作,此提交将按原样应用。
如果您已关闭该通知,请在主菜单中选择 Git | 继续变基 以继续。
重写提交消息 :点击 改写 或双击某个提交,并在打开的小型编辑器中编辑文本。
将两个提交合并为一个 :选择要合并到上一个的提交,并点击 压缩 或 压缩 按钮旁的箭头,然后点击 修复。
如果您点击 压缩 ,默认情况下会合并两个提交的消息,因此如果您不修改生成的提交消息,此操作将在分支历史中得到体现。
如果您点击 修复, fixup 提交的提交消息将被丢弃,因此此更改在分支历史中将不可见。
在这两种情况下,您将能够在应用其中一个操作时打开的小型编辑器中编辑提交消息。
Ignore a commit :点击 丢弃 使所选提交中的更改不被应用。
撤销所有更改 :点击 重置 以丢弃您对提交所应用的所有操作。
因此, 正在变基提交 对话框会显示一张图,展示您在分支中对提交所应用的所有操作,以便您在开始变基之前进行审查:

点击 开始变基。
编辑分支历史并将其集成到另一个分支
PyCharm 允许您 变基 一个分支到另一个分支之上,并在应用更改之前编辑源分支历史。
在主菜单中选择

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

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

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

PyCharm 会在开始变基操作之前检出此分支。
根据您的具体情况,从 修改选项 列表中选择其他选项:
--rebase-merges:保留待变基提交中的分支结构。请注意,这些合并提交中已解决的合并冲突或手动更改需要手动重新解决或重新应用。
--keep-empty:保留空提交,即相对于其父项没有任何更改的提交。--root:变基分支中可达的所有提交。--update-refs:自动强制更新所有指向正在变基的提交的分支。--autosquash:自动压缩标记为 fixup 或 squash 的提交。
点击 变基。
交互式变基 对话框将显示,包含当前分支中在所选提交之后所做的所有提交列表。

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

您可以修改此提交使用上下文操作(例如 还原、 撤销、 修订 等,然后继续变基。 如果您不执行任何操作,此提交将按原样应用。
如果您已关闭该通知,请在主菜单中选择 Git | 继续变基 以继续。
重写提交消息 :点击 改写 或双击某个提交,并在打开的小型编辑器中编辑文本。
将两个提交合并为一个 :选择要合并到上一个的提交,并点击 压缩 或 压缩 按钮旁的箭头,然后点击 修复。
如果您点击 压缩 ,默认情况下会合并两个提交的消息,因此如果您不修改生成的提交消息,此操作将在分支历史中得到体现。
如果您点击 修复, fixup 提交的提交消息将被丢弃,因此此更改在分支历史中将不可见。
在这两种情况下,您将能够在应用其中一个操作时打开的小型编辑器中编辑提交消息。
Ignore a commit :点击 丢弃 使所选提交中的更改不被应用。
撤销所有更改 :点击 重置 以丢弃您对提交所应用的所有操作。
因此, 正在变基提交 对话框会显示一张图,展示您在分支中对提交所应用的所有操作,以便您在开始变基之前进行审查:

点击 开始变基。
拣选单个提交
有时,您只需将单个提交应用到另一个分支,而无需对整个分支执行变基或合并。 这在某些情况下很有用,例如,如果您在功能分支中工作,并希望集成来自 main 的热修复,而该热修复是在两个分支分叉之后提交的。 或者,您可能希望将修复回移植到先前的发布分支。 您可以使用 拣选 操作来实现。
拣选操作的状态显示在状态栏中。 您可以随时通过在 Git 分支 弹出窗口中选择 中止优选 来中止正在进行的拣选。

将提交应用到另一个分支
在 分支 弹出窗口(主菜单 ),选择要将更改集成到的目标分支,并从弹出菜单中选择 签出 切换到该分支。
打开 Git 工具窗口 Alt+9 并切换到 日志 选项卡。
定位包含您要拣选的更改的提交。
您可以按分支、用户或日期筛选提交。 您还可以在工具栏上点击
并选择 高亮显示 | 未拣选的提交 选项,将已应用到当前分支的提交灰显。 如果您知道提交哈希,或者正在查找带标签的提交,您也可以使用 转到哈希 / 分支 / 标签 操作(在 Git 工具窗口 Alt+9 的 日志 选项卡中按 Ctrl+F ,或点击工具栏上的
)。
选择所需的提交。 使用 提交详细信息 区域中的信息,确保这些就是您要应用到另一个分支的更改。
点击工具栏上的 拣选
。 PyCharm 将把更改应用并提交到目标分支。
如果拣选因冲突而失败,所选更改将出现在 提交 工具窗口 Alt+0 中的 更改 区域中。 您可以查看这些更改,并在必要时稍后提交。
如果您希望 PyCharm 在拣选失败时自动创建更改列表,请在 中启用相应设置。
将更改推送到目标分支。
以下视频将帮助您了解拣选的工作方式:
应用单独的更改
假设您对某个文件做了一些更改,并希望将这些更改应用到另一个分支,但这些更改已与其他已修改的文件一起提交。 PyCharm 允许您将单独的更改应用到更改列表,而无需立即提交,而不是拣选整个提交。
在 分支 弹出窗口(主菜单 ),选择要将更改集成到的目标分支,并从弹出菜单中选择 签出 切换到该分支。
打开 Git 工具窗口 Alt+9 并切换到 日志 选项卡。
定位包含您要应用的更改的提交。
您可以按分支、用户或日期筛选提交。 您还可以在工具栏上点击
并选择 高亮显示 | 未拣选的提交 选项,将已应用到当前分支的提交灰显。 如果您知道提交哈希,或者正在查找带标签的提交,您也可以使用 转到哈希 / 分支 / 标签 操作(在 Git 工具窗口 Alt+9 的 日志 选项卡中按 Ctrl+F ,或点击工具栏上的
)。
在 提交详细信息 右侧的窗格中,选择包含您要应用到目标分支的更改的文件,并从上下文菜单中选择 拣选所选更改。
在打开的对话框中,选择现有的更改列表或输入新更改列表的名称,然后点击 确定。
提交更改,然后将其推送到目标分支。
应用单独的文件
除了将单独的更改应用到单个文件之外,您还可以将整个文件的内容复制到另一个分支。 这在某些情况下很有用,例如,如果您要应用的文件在目标分支中不存在,或者对其的更改分散在多个提交中。
切换 到将应用更改的分支。
在 分支 弹出窗口(主菜单 )或 Git 工具窗口的 分支 窗格中,选择包含您要应用的文件的分支,并从上下文菜单中选择 显示与工作树的差异。
打开的 更改 工具窗口会显示所选分支与当前检出的分支相比存在差异的所有文件列表:
在所选分支中存在、但在当前分支中缺失的文件以灰色标记。
在当前分支中存在、但在所选分支中缺失的文件以绿色标记。
在所选分支与当前分支之间存在差异的文件以蓝色标记。
您可以点击 交换分支 链接来更改将其他分支与之比较的基准分支。
选择要应用到当前分支的文件,并从上下文菜单中选择 从分支获取 ,或点击工具栏上的
。
提交并推送更改。 PyCharm 将把整个文件的内容复制到当前分支。