使用 Git 同时处理多个功能
最后修改时间:2023 年 9 月 7 日有时,您需要在未完成的任务之间切换,然后再返回。IntelliJ IDEA 为您提供了几种方法来方便地处理多种不同的功能,而不会丢失您的工作:
隐藏更改与搁置非常相似。唯一的区别在于补丁的生成和应用方式。存储由 Git 生成,可以从 IntelliJ IDEA 内部或外部应用。搁置更改的补丁由 IntelliJ IDEA 生成,也通过 IDE 应用。此外,存储涉及所有未提交的更改,而当您将更改放入搁置时,您可以选择一些本地更改,而不是搁置所有更改。
您可以创建分支来处理不同的不相关功能。
搁置变更
搁置是暂时存储您尚未提交的待处理更改。例如,如果您需要切换到另一个任务,并且希望将更改放在一边以供稍后处理,则这非常有用。
使用 IntelliJ IDEA,您可以搁置单独的文件和整个变更列表。
笔记
您无法搁置未版本化的文件,即尚未添加到版本控制的文件。
搁置后,可以根据需要多次应用更改。
搁置变更
在 “提交”工具窗口中,右键单击要搁置的文件或更改列表,然后从上下文菜单中选择“搁置更改” 。Alt00
在“搁置更改”对话框中,查看已修改文件的列表。
在“提交消息”字段中,输入要创建的架子的名称,然后单击“架子更改”按钮。
您还可以静默搁置更改,而不显示“搁置更改”对话框。为此,请选择要搁置的文件或更改列表,然后单击工具栏上的“静默搁置”图标或按。包含要搁置的更改的更改列表的名称将用作搁置名称。CtrlShift0H
为了避免出现多个同名的架子(例如Default),您可以将文件或更改列表从“提交到 <branch>”选项卡拖到“提交”工具窗口的“架子”选项卡,稍等片刻直到它被激活,释放鼠标按钮后编辑新的架子名称。
提示
如果您需要将更改复制到架子而不重置本地更改,请按并查找“保存到架子”操作。CtrlShift0A
取消搁置变更
取消搁置是将推迟的更改从搁架移动到待处理的更改列表。未搁置的更改可以从视图中过滤掉或从搁置中删除。
在“搁置”选项卡中,选择更改列表或要取消搁置的文件。
按或从所选内容的上下文菜单中选择“取消搁置” 。CtrlShift0U
在“取消搁置更改”对话框中,在“名称”字段中指定要将未搁置的更改恢复到的更改列表。您可以从列表中选择现有变更列表或输入要创建的新变更列表的名称。您可以在注释字段中输入新变更列表的描述(可选)。
如果您想让新的更改列表处于活动状态,请选择“设置活动”。否则,当前活动变更列表保持活动状态。
如果您希望 IntelliJ IDEA 在停用时保存与新变更列表关联的任务的上下文,并在变更列表变为活动状态时恢复上下文,请选择“跟踪上下文”选项(有关详细信息,请参阅任务和上下文)。
如果要删除要取消搁置的更改,请选择“从搁置中删除已成功应用的文件”选项。未搁置的文件将从该搁置中删除,添加到另一个更改列表中,并标记为已应用。只有通过单击工具栏上的 或从上下文菜单中选择清理已取消搁置来明确删除它们,它们才会被完全删除。
笔记
如果您意外删除了未搁置的文件,您可以从“最近删除”节点查看和恢复它们。
单击“确定”。如果修补版本与当前版本发生冲突,请按照解决冲突中的说明进行解决。
您还可以静默取消搁置更改,而不显示“取消搁置更改”对话框。为此,请选择要取消搁置的文件或更改列表,然后单击工具栏上的“静默取消搁置”图标或按。未搁置的文件将移至活动的挂起更改列表。CtrlAlt0U
您还可以将文件或更改列表从“搁置”选项卡拖到“提交到 <branch>”选项卡以静默取消搁置。如果按住键拖动它,它将被复制到“提交到分支”选项卡,但也会保留在架子中。Ctrl
放弃搁置的更改
在“书架”视图中,选择包含您不想再保留的更改的更改列表。
右键单击更改列表,然后从上下文菜单中选择“删除”或按。Delete
恢复未搁置的更改
IntelliJ IDEA 允许您在必要时重新应用未搁置的更改。所有未搁置的更改都可以重复使用,直到通过单击工具栏上的图标或从上下文菜单中选择“清理已未搁置”来明确删除它们为止。
确保已启用显示已取消搁置的工具栏选项。
选择要恢复的文件或架子。
从所选内容的上下文菜单中,选择“恢复”。
应用外部补丁
您可以导入在 IntelliJ IDEA 内部或外部创建的补丁,并将它们作为搁置的更改应用。
在Shelf视图中,从上下文菜单中选择Import Patches 。
在打开的对话框中,选择要应用的补丁文件。选定的补丁将在“Shelf”选项卡中显示为“shelf”。
选择新添加的带有补丁的架子,然后从所选内容的上下文菜单中选择“取消搁置更改” 。
自动搁置基础修订
将 IntelliJ IDEA 配置为始终搁置受 Git 版本控制的文件的基本修订版本可能很有用。
按打开 IDE 设置,然后选择版本控制 | 架子。CtrlAlt0S
选择“在分布式版本控制系统下搁置文件的基本修订版本”选项。
如果启用此选项,文件的基本修订版本将保存到架子上,如果应用架子导致冲突,则该架子将在三向合并期间使用。如果禁用,IntelliJ IDEA 将在项目历史记录中查找基础修订版,这可能需要一段时间;此外,冲突架所基于的修订可能会丢失(例如,如果历史记录因变基操作而更改)。
更改默认架子位置
默认情况下,shelf 目录位于您的项目目录下。但是,您可能想要更改默认的架子位置。例如,如果您想避免在清理工作副本时意外删除架子,或者希望将它们存储在单独的存储库中,以便在团队成员之间共享架子,这可能很有用。
按打开 IDE 设置,然后选择版本控制 | 架子。CtrlAlt0S
单击更改书架位置并在打开的对话框中指定新位置。
如有必要,选择将架子移动到新位置以将现有架子移动到新目录。
观看此视频教程,了解如何从书架中受益,以便能够切换到不同的任务而不丢失未完成的工作:
隐藏更改
有时可能需要恢复工作副本以匹配 HEAD 提交,但您不想丢失已经完成的工作。如果您了解到存在可能与您正在做的事情相关的上游更改,或者您需要进行一些紧急修复,则可能会发生这种情况。
存储涉及记录 HEAD 提交和工作目录当前状态(存储)之间的差异。对索引的更改也可以被隐藏。
取消存储涉及将存储的存储应用到分支。
您可以将存储应用到现有分支或在其基础上创建新分支。
存储可以根据需要多次应用到您需要的任何分支,只需切换到所需的分支即可。请记住:
在一系列提交后应用存储会导致需要解决的冲突。
您不能将存储应用到“脏”工作副本,即具有未提交更改的工作副本。
将更改保存到存储中
转到 Git | 未提交的更改 | 隐藏更改。
在打开的“存储”对话框中,选择适当的 Git 根目录并确保签出正确的分支。
在“消息”字段中描述您要存储的更改。
要存储本地更改并将索引中暂存的更改引入工作树以进行检查和测试,请选择“保留索引”选项。
单击创建存储。
应用隐藏
转到 Git | 未提交的更改 | 取消隐藏更改。
选择要应用存储的 Git 根目录,并确保签出正确的分支。
从列表中选择您想要应用的存储。
如果您想检查所选存储中哪些文件受到影响,请单击“查看”。
要在应用所选存储后将其删除,请选择“弹出存储”选项。
要同时应用隐藏的索引修改,请选择“恢复索引”选项。
如果您想基于所选存储创建新分支,而不是将其应用到当前签出的分支,请在作为新分支字段中输入该分支的名称。
要删除存储,请在列表中选择它,然后单击“删除”。要删除所有隐藏内容,请单击“清除”。
笔记
如果存在冲突,此操作可能会失败。发生这种情况是因为冲突存储在索引中,您无法再按原始状态应用更改。
将更改分组到不同的更改列表中
当您正在开发多个相关功能时,您可能会发现将更改分组到不同的更改列表中很方便。与使用功能分支来处理多个任务相比,这种方法有其优点和缺点。
优点:
您可以轻松地在不同的逻辑更改集之间切换,并分别提交它们。
与出于相同目的使用分支不同,您可以随时进行所有更改,而无需在分支之间切换,如果您的项目非常大,这可能需要一段时间。
测试不同功能如何协同工作很方便。
您可以在构建服务器上远程运行更改列表。
缺点:
虽然与分支相比,使用更改列表似乎是一个更轻量级的选项,但它并不安全,因为在提交并推送更改之前,没有更改的备份。如果您的本地工作副本发生问题,您的所有更改都将丢失,因为它们不属于 Git 项目历史记录。
不可能对功能进行原子测试。
不可能就同一功能进行协作。此外,除非您通过电子邮件发送包含更改的补丁,否则您无法从不同的计算机进行贡献,这可能不是很方便。
所有更改列表都显示在 “提交到 <branch>”选项卡的“更改”视图中。所有修改的文件都会自动放置在活动变更列表中,即“更改”变更列表,除非您创建了不同的变更列表并将其激活。
更改列表显示在 “更改”视图中。最初,有一个名为Changes的默认更改列表。所有新更改都会自动放入更改更改列表中。还有一个未版本控制的文件更改列表,用于对尚未添加到 VCS 中的新创建的文件进行分组。
您可以根据需要创建任意数量的更改列表,并随时使其中任何一个更改列表处于活动状态。您可以将任何未提交的更改移至任何更改列表。
创建新的变更列表
在“本地更改”视图中,单击工具栏上的 并选择“新建更改列表”。
在“新建更改列表”对话框中,指定新更改列表的名称,并添加说明(可选)。
设置活动变更列表
在“本地更改”视图中,选择一个非活动更改列表,然后按或右键单击它,然后从上下文菜单中选择“设置活动更改列表” 。所有新的更改都会自动放入此更改列表中。CtrlSpace
在更改列表之间移动更改
在“本地更改”视图中,选择要移动到另一个更改列表的更改。
右键单击所选内容或单击工具栏上的 并选择“移动到另一个更改列表” 。AltShift0M
在打开的对话框中,选择现有变更列表或输入新变更列表的名称。
您可以选择使目标更改列表处于活动状态并跟踪其上下文(IntelliJ IDEA 将保存与此更改列表关联的上下文,并在该更改列表变为活动状态时恢复它)。
提示
您还可以在更改列表之间拖动文件。
笔记
有关将一个文件中的更改放入 Git 中的不同更改列表的更多信息,请参阅将更改放入不同的更改列表。
删除变更列表
右键单击更改列表,然后从上下文菜单中选择“删除更改列表” 。
使用功能分支
Git 中的分支代表独立的开发线,因此,如果您正在开发一个单独的功能,并且希望在准备好共享工作结果并将其集成到 中之前完成并测试该功能,那么在功能分支中执行此操作master
是最好的解决方案。通过这种方式,您可以确保不稳定的代码不会提交到项目的主代码库,并且如果需要,您可以轻松切换到其他任务。
优点:
与使用变更列表对变更进行分组相反,使用功能分支是安全的。在您向 Git 提交更改后,它们将成为 Git 项目历史记录的一部分,因此即使您损坏了工作树,您也始终可以通过Git reflog恢复您的提交。推送更改后,它们就会被备份。
您可以开发并行的不相关功能并以原子方式测试它们。
当您完成分支中的开发后,您可以重新排序或压缩提交,以便您的历史记录是线性且干净的。
可以轻松地就您的功能进行协作,或者从不同的机器上进行开发。
缺点:
在非常大的项目上切换分支可能需要时间。
一起测试相关功能不太方便。
您必须学习使用功能分支并将更改集成到主代码库中的工作流程。
使用功能分支并将更改集成到主代码库中有两种主要方法:
使用合并来集成功能分支中的更改
合并选项的主要好处是完全可追溯性,因为合并到主代码库中的提交保留了其原始哈希值和作者,并且属于一项功能的所有提交都可以分组在一起。
此工作流程适用于向主代码库提交更改涉及拉取请求或分层审批程序的项目,因为现有分支不会以任何方式更改。
这种方法的主要缺点是,每次需要合并更改时都会创建无关的合并提交,这会严重污染项目历史记录并使其难以阅读。
使用 rebase 集成功能分支中的更改
此选项的主要好处是您可以获得清晰的项目历史记录,易于其他人阅读和理解。您的日志不包含操作产生的不必要的合并提交merge
,并且您可以获得易于导航和搜索的线性历史记录。
然而,当决定采用此工作流程时,您应该记住,这会rebase
重写项目历史记录,因为它会为原始功能分支中的每个提交创建新的提交,因此它们将具有不同的哈希值,这会阻碍可追溯性。
为您单独的开发线创建一个分支。
在开发过程中经常提交更改。
将您的分支推送到远程存储库。这样做是为了备份,以便您可以在不同的计算机上进行协作或工作。
master
时不时地重新调整你的功能分支。仅当您的功能分支很长时才有意义。这对于:确保你的功能分支
master
不会相距太远。当您最终将更改集成到主代码库中时,避免解决大量冲突。当您定期进行变基时,您可以迭代地解决冲突,并且不会最终因长期差异而苦苦挣扎。
加快检查分支的速度,因为一旦分支足够分散,分支之间的切换就会变慢。
变基涉及以下步骤:
master
当您需要执行与您的功能无关的工作时切换到。当您返回到功能分支时,执行Checkout 并 Rebase 到 Current。对您的功能进行审查和测试,并进行必要的修复。
当您的功能完成后,执行交互式变基。这允许您重新排序和压缩提交,以使您的功能分支历史记录看起来干净整洁。
当您准备好将工作结果集成到主分支中时(例如
master
),请执行以下操作:
提示
使用您的姓名缩写或昵称(如果很短)作为功能分支名称的前缀是有意义的。这样,您始终可以使用“分支机构”菜单中的快速搜索轻松找到所有分支机构。
感谢您的反馈意见!