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