将更改从一个 Git 分支应用到另一分支
最后修改时间:2023 年 10 月 23 日在 Git 中,有多种方法可以将一个分支的更改集成到另一个分支:
合并分支
假设您创建了一个功能分支来处理特定任务,并希望在完成并测试功能后将工作结果集成到主代码库中:
将分支合并到 master 是最常见的方法。
当您在功能分支中工作时,您的队友会继续将他们的工作提交给 master,这是很常见的情况:
当您运行时merge
,功能分支中的更改将集成到目标分支的 HEAD 中:
Git 创建一个新的提交 (M),称为合并提交,它是从两个分支分歧点合并来自功能分支和主分支的更改而产生的。
合并分支
在“分支”弹出窗口(主菜单Git | 分支)或 Git工具窗口的“分支”窗格中,选择要将更改集成到的目标分支,然后从上下文菜单中选择“签出”以切换到该分支。
执行以下操作之一:
如果不需要指定合并选项,请选择要合并到当前分支的分支,然后从子菜单中选择“合并到当前”。
如果需要指定合并选项,请从主菜单中选择VCS Git | 合并更改以打开“合并”对话框:
选择要合并到当前分支的分支,单击“修改选项”并从以下选项中进行选择:
--no-ff
:在所有情况下都会创建合并提交,即使可以将合并解析为快进。--ff-only
:只有可以快进时,合并才会被解决。--squash
:将在当前分支之上创建包含所有拉取更改的单个提交。-m
:您将能够编辑合并提交的消息。--no-commit
:将执行合并,但不会创建合并提交,以便您可以在提交之前检查合并的结果。
单击“合并”。
如果你的工作树是干净的(这意味着你没有未提交的更改),并且你的功能分支和目标分支之间没有发生冲突,Git 将合并这两个分支,并且合并提交将出现在 Git 工具的 Log选项卡 中窗户 :Alt09
如果您的分支与目标分支之间发生冲突,系统会提示您解决冲突(请参阅解决冲突)。如果合并后仍有未解决的冲突,则“合并冲突”节点将出现在 “更改”视图的相应更改列表中,并提供解决这些冲突的链接。
如果您的本地更改将被合并覆盖,IntelliJ IDEA 将建议执行智能合并。如果您选择此选项,IntelliJ IDEA 将存储未提交的更改,执行合并,然后取消存储更改。
笔记
您可以通过从Git Branches弹出窗口中选择Abort操作来取消未完成的合并操作。
变基分支 (git-rebase)
当您将rebase
一个分支转移到另一个分支时,您可以将第一个分支的提交应用到第二个分支中的 HEAD 提交之上。
假设您创建了一个功能分支来处理特定任务并向该分支进行了多次提交:
当您在分支中开发时,您的队友会继续致力于掌握他们的工作:
当您执行操作时,您可以通过将您的提交应用到当前 HEAD 提交之上,将rebase
您在功能分支中所做的更改集成到该分支中:master
master
将一个分支重新建立在另一个分支之上
从主菜单中选择 Git | 变基:
从列表中,选择要将当前分支变基到的目标分支:
如果您需要从特定提交开始对源分支进行变基,而不是对整个分支进行变基,请单击修改选项并选择--onto。在源分支字段中,输入要将当前分支应用到新基础的提交的哈希值:
提示
要复制提交哈希,请在Log中选择它,右键单击它并选择Copy Revision Number。
如果您要变基的分支当前未签出,请单击“修改选项”,单击“选择另一个要变基的分支”,然后从显示的列表中选择一个分支:
IntelliJ IDEA 将在开始变基操作之前检查此分支。
如果要对分支中可访问的所有提交进行变基,请单击修改选项并选择--root(有关此选项的更多信息,请参阅git-rebase)。
如果您需要保留空提交(即不会从其父级更改任何内容的提交),请单击修改选项并选择--keep-empty(有关此选项的更多信息,请参阅git-rebase)。
如果您想在变基期间保留合并提交以便将它们保留在分支历史记录中,请单击“修改选项”并选择--preserve-merges(此选项对于
interactive
变基不可用)。单击变基。
笔记
您可以通过从Git 分支弹出窗口顶部分别选择“中止”或“继续”操作来取消未完成的变基操作或恢复中断的变基操作。
如果不需要指定变基选项,则可以在不调用变基对话框的情况下启动变基。在“分支”弹出窗口或Git工具窗口的“分支”窗格中,选择一个分支并选择以下操作之一:
使用 Rebase (对于远程分支)拉入 Current以从所选分支中获取更改,并在这些更改的基础上对当前分支进行变基。
检出并重新定基到当前(对于远程和本地分支)以检出所选分支并将其重新定基到当前检出的分支之上。如果远程分支本地不存在,IntelliJ IDEA 将静默创建一个跟踪的本地分支,检出并重新设置基准。
将当前分支重新设置为所选分支(对于远程和本地分支)以将当前签出的分支重新设置为所选分支的基础。
有关在变基期间跳过或压缩提交的更多信息,请参阅通过执行交互式变基编辑项目历史记录。
观看此视频以更好地了解如何执行变基操作:
挑选单独的提交
有时,您只需要将单个提交应用到不同的分支,而不是变基或合并整个分支。这可能很有用,例如,如果您正在一个功能分支中工作,并且想要集成在两个分支分歧后提交的master 的修补程序。或者您可能想要将修复向后移植到以前的版本分支。您可以通过使用Cherry-pick操作来完成此操作。
挑选操作的状态显示在状态栏中。您始终可以通过在Git Branches弹出窗口中选择Abort Cherry-Pick来中止正在进行的 Cherry-Pick 。
将提交应用到另一个分支
在“分支”弹出窗口(主菜单Git | Branches)中,选择要将更改集成到的目标分支,然后从弹出菜单中选择“签出”以切换到该分支。
打开 Git工具窗口 并切换到“日志”选项卡。Alt09
找到包含您要挑选的更改的提交。
您可以按分支、用户或日期过滤提交。您还可以单击工具栏上的 并选择突出显示| 未选择的提交选项可将已应用于当前分支的提交灰显。如果您知道提交哈希,或者正在寻找标记的提交,您还可以使用“转到哈希/分支/标记”操作(按Git 工具窗口 的 “日志”选项卡,或单击工具栏上的 )。Ctrl0FAlt09
选择所需的提交。使用“提交详细信息”区域中的信息来确保这些是您想要传输到另一个分支的更改。
单击工具栏上的择优挑选。 IntelliJ IDEA 将应用更改并将更改提交到目标分支。
如果挑选因冲突而失败,所选更改将显示在“更改”区域中,您可以在“更改”视图中看到 。您可以查看这些更改并在必要时稍后提交。
如果您希望 IntelliJ IDEA 在cherry-pick失败的情况下自动创建变更列表,请在“设置”|“设置”中打开相应的设置。版本控制 | 变更列表。
将更改推送到目标分支。
以下视频将帮助您了解cherry-pick 的工作原理:
应用单独的更改
想象一下,您对一个文件进行了一些更改,并希望将其应用到不同的分支,但这些更改是与其他修改的文件一起提交的。IntelliJ IDEA 允许您应用单独的更改,而不是挑选整个提交。
在“分支”弹出窗口(主菜单Git | Branches)中,选择要将更改集成到的目标分支,然后从弹出菜单中选择“签出”以切换到该分支。
打开 Git工具窗口 并切换到“日志”选项卡。Alt09
找到包含您要应用的更改的提交。
您可以按分支、用户或日期过滤提交。您还可以单击工具栏上的 并选择突出显示| 未选择的提交选项可将已应用于当前分支的提交灰显。如果您知道提交哈希,或者正在寻找标记的提交,您还可以使用“转到哈希/分支/标记”操作(按Git 工具窗口 的 “日志”选项卡,或单击工具栏上的 )。Ctrl0FAlt09
在右侧的“提交详细信息”窗格中,选择包含要应用到目标分支的更改的文件,然后从上下文菜单中选择“Cherry-Pick Selected Changes” 。
在打开的对话框中,选择现有变更列表或输入新变更列表的名称,然后单击“确定”。
提交更改,然后将其推送到目标分支。
应用单独的文件
除了对单个文件应用单独的更改之外,您还可以将整个文件的内容复制到不同的分支。例如,如果目标分支中不存在要应用的文件,或者在多次提交中对其进行了更改,这可能很有用。
切换到将应用更改的分支。
在“分支”弹出窗口(主菜单Git | Branches)或 Git工具窗口的“分支”窗格中,选择包含要应用的文件的分支,然后从上下文菜单中选择“显示与工作树的差异” 。
打开的“更改”工具窗口显示所选分支中与当前签出的分支相比不同的所有文件的列表:
所选分支中存在且当前分支中缺失的文件标记为灰色。
当前分支中存在但所选分支中缺失的文件标记为绿色。
包含所选分支和当前分支之间差异的文件用蓝色标记。
您可以单击“交换分支”链接来更改将哪个分支视为与其他分支进行比较的基础。
选择要应用到当前分支的文件,然后从上下文菜单中选择“从分支获取”或单击工具栏上的 。
提交并推动更改。IntelliJ IDEA 会将文件的全部内容复制到当前分支。
笔记
您还可以从“项目”视图将文件应用到另一个分支:选择包含要复制的文件的文件夹,然后选择“Git |”。与分支比较| 从上下文菜单中选择<branch_name> ,然后单击工具栏上的“获取”图标。
感谢您的反馈意见!