https://intellijidea.com.cn/help/idea/resolving-conflicts.html
https://www.jetbrains.com/help/idea/resolve-conflicts.html
idea 官方文档
当您在团队中工作时,您可能会遇到这样的情况:有人对您当前正在处理的文件进行更改。如果这些更改没有重叠(也就是说,对不同的代码行进行了更改),则冲突的文件将自动合并。但是,如果相同的行受到影响,Git不能随机选择其中一方而不是另一方,并要求您解决冲突。
在Git中,当您尝试执行以下操作之一时,可能会出现冲突:pull, merge, rebase, cherry-pick, unstash changes或 apply a patch。如果存在冲突,这些操作将失败,并提示您接受上游版本,选择您的版本,或合并更改:
当在Git级别检测到冲突时,会自动触发Conflicts对话框。
如果你在这个对话框中点击Close ,或者从命令行调用导致合并冲突的Git操作,一个Merge Conflicts节点将出现在Commit 工具窗口的Changes 视图中,并提供一个解决冲突的链接:
IntelliJ IDEA提供了解决局部冲突的工具。此工具由三个窗格组成:
- 左侧窗格显示只读本地副本
- 右窗格显示签入到存储库的只读版本。
- 中间窗格是一个功能齐全的编辑器,其中显示解决冲突的结果。最初,此窗格的内容与文件的
base revision
相同,即派生两个冲突版本的版本。
1 修改的行
2 删除行
3 新增行
4 冲突的行
1、解决冲突
-
在Conflicts对话框中单击Merge,在Local Changes视图中单击Resolve链接,或者在编辑器中选择冲突文件并在主菜单中选择VCS | Git | Resolve Conflicts。
-
要自动合并所有不冲突的更改,请单击工具栏上的
(应用不冲突的更改,Apply All Non-Conflicting Changes)按钮(应用所有不冲突的更改)。您还可以分别使用
应用非冲突更改”(从左侧应用非冲突更改,Apply Non-Conflicting Changes from the Left Side)和
应用非冲突更改(从右侧应用非冲突更改,Apply Non-Conflicting Changes from the Right Side)来合并来自对话框左/右部分的非冲突更改。 -
要解决冲突,您需要选择将哪个操作(接受accept
按钮或忽略ignore按钮
)应用到左(本地)和右(存储库)版本,并在中央窗格中检查结果代码:
您还可以右键单击中间窗格中突出显示的冲突,并使用上下文菜单中的命令。Resolve using Left和Resolve using Right命令分别提供了从一侧接受更改和从另一侧忽略更改的快捷方式:
对于简单的冲突(例如,如果在不同的文件版本中修改了同一行的开头和结尾),则可以使用Resolve simple conflicts
按钮,该按钮允许在一次单击中合并更改。
这些冲突不能通过Apply All Non-Conflicting Changes操作来解决,因为您必须确保它们被正确地解决了。
请注意,中间窗格是一个功能齐全的编辑器,因此您可以直接在此对话框中更改生成的代码。
- 比较不同的版本以解决冲突可能也很有用。使用Compare contents按钮
工具栏按钮调用选项列表。注意,Base指的是本地版本和存储库版本源自的文件版本(最初显示在中间窗格中),而Middle 指的是结果版本。 - 在中央窗格中查看合并结果并单击Apply。
2、生产力技巧
Apply non-conflicting changes automatically
您可以将IntelliJ IDEA配置为总是自动应用无冲突的更改,而不是在Merge对话框中告诉它这样做。要做到这一点,在设置Ctrl
Alt
S
Tools | Diff Merge页面上选择“自动应用非冲突更改,Automatically apply non-conflicting changes”选项
管理中间窗格中的更改
您可以使用工具栏来管理中间窗格中的更改,当您将鼠标悬停在gutter 中的更改标记上并单击它时,该工具栏将出现。工具栏同时显示一个框,显示修改行之前的内容:
例如,当存在多个不冲突的更改,并且您只需要跳过其中的一个或两个更改时,使用apply所有不冲突的更改(Apply all non-conflicting changes)操作同时应用所有更改,然后使用此工具栏中的Revert操作撤消不需要的更改会更容易。
3、处理与LF和CRLF行结束相关的冲突
系统行末结束符 - 换行(Line Feed)和回车(Carriage Return)的区别
通常,在一个团队中工作并对同一个存储库做出贡献的人使用不同的操作系统。这可能会导致行结束的问题,因为Unix、Linux和macOS使用LF
,而Windows使用CRLF
来标记行结束。
IntelliJ IDEA在Diff Viewer中显示行结尾的差异,因此您可以手动修复它们。如果你想让Git自动解决这些冲突,你需要在Windows上设置core.autocrlf
设置为true
,在Linux和macOS上设置为input
(更多详细信息,请参见处理行结束符)。
你可以通过在Windows运行git config --global core.autocrlf true
手动更改配置,Linux和macOS上运行git config --global core.autocrlf input
但是,IntelliJ IDEA可以自动分析您的配置,在您准备将CRLF
提交到远程存储库时发出警告,并根据您的操作系统建议设置core.autocrlf
为true
或input
。
要启用LF
和CRLF
行分隔符的智能处理,请Ctrl
Alt
S
打开设置对话框,并选择左侧的Version Control | Git 节点。启用“Warn if CRLF line separators are about to be committed”选项。
在你启用了这个选项之后,IntelliJ IDEA会在每次你要用CRLF
分隔符提交文件时显示行分隔符警告对话框(Line Separators Warning Dialog),除非你在受影响的文件中设置了任何相关的Git属性(在这种情况下,IntelliJ IDEA假设你清楚地了解你在做什么,并从分析中排除了这个文件)。
在“行分隔符警告”对话框中,单击以下选项之一:
- Commit As Is 忽略警告并提交带有
CRLF
分隔符的文件。 - Fix and Commit 需要依据您的操作系统 将
core.autocrlf
属性设置为true
或input
。因此,在提交之前,将用LF替换CRLF行分隔符。
如果稍后需要查看在合并过程中冲突是如何解决的,可以在Git工具窗口Alt
9
的Log选项卡中找到所需的合并提交,在右侧的“Commit Details”窗格中选择存在冲突的文件,单击“Show diff”图标
或按Ctrl
d
键. 有关更多信息,请参阅查看如何合并更改。
查看如何合并更改
IntelliJ IDEA允许您查看变更是如何从一个分支合并到另一个分支的,以及在合并期间冲突(如果有的话)是如何解决的:
- 按
Alt
9
在Git工具窗口的Log选项卡中,选择您感兴趣的合并提交。- 如果在合并过程中没有检测到并解决冲突,IntelliJ IDEA将在更改文件Changed Files窗格中显示相应的消息,并建议审查来自两个分支的更改:
- 从其中一个节点中选择所需的文件,然后单击工具栏上的Show Diff
图标或按Ctrl
D
. Diff Viewer将显示一个两面板的Diff,允许您将当前版本与所选父版本进行比较。
- 如果在合并过程中没有检测到并解决冲突,IntelliJ IDEA将在更改文件Changed Files窗格中显示相应的消息,并建议审查来自两个分支的更改:
- 如果在合并过程中发生了冲突,“已更改文件,Changed Files”窗格将显示与冲突合并的文件列表。
从其中一个节点中选择所需的文件,然后单击工具栏上的Show Diff
图标或按Ctrl
D
. Diff Viewer将显示一个三面板的Diff,允许您将当前版本与其每个父版本进行比较,并查看冲突是如何解决的。