用Idea 解决Git冲突

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、解决冲突

  1. Conflicts对话框中单击Merge,在Local Changes视图中单击Resolve链接,或者在编辑器中选择冲突文件并在主菜单中选择VCS | Git | Resolve Conflicts

  2. 要自动合并所有不冲突的更改,请单击工具栏上的“
    (应用不冲突的更改,Apply All Non-Conflicting Changes)按钮(应用所有不冲突的更改)。您还可以分别使用来自左侧按钮的“
    应用非冲突更改”(从左侧应用非冲突更改,Apply Non-Conflicting Changes from the Left Side)和在这里插入图片描述
    应用非冲突更改(从右侧应用非冲突更改,Apply Non-Conflicting Changes from the Right Side)来合并来自对话框左/右部分的非冲突更改。

  3. 要解决冲突,您需要选择将哪个操作(接受accept
    按钮在这里插入图片描述或忽略ignore按钮在这里插入图片描述
    )应用到左(本地)和右(存储库)版本,并在中央窗格中检查结果代码:
    在这里插入图片描述
    您还可以右键单击中间窗格中突出显示的冲突,并使用上下文菜单中的命令Resolve using LeftResolve using Right命令分别提供了从一侧接受更改和从另一侧忽略更改的快捷方式:
    在这里插入图片描述
    对于简单的冲突(例如,如果在不同的文件版本中修改了同一行的开头和结尾),则可以使用Resolve simple conflicts(Resolve简单冲突)
    按钮,该按钮允许在一次单击中合并更改。

在这里插入图片描述
这些冲突不能通过Apply All Non-Conflicting Changes操作来解决,因为您必须确保它们被正确地解决了。

请注意,中间窗格是一个功能齐全的编辑器,因此您可以直接在此对话框中更改生成的代码。

  1. 比较不同的版本以解决冲突可能也很有用。使用Compare contents按钮在这里插入图片描述
    工具栏按钮调用选项列表。注意,Base指的是本地版本和存储库版本源自的文件版本(最初显示在中间窗格中),而Middle 指的是结果版本。
  2. 在中央窗格中查看合并结果并单击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.autocrlftrueinput

要启用LFCRLF行分隔符的智能处理,请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属性设置为trueinput 。因此,在提交之前,将用LF替换CRLF行分隔符。

如果稍后需要查看在合并过程中冲突是如何解决的,可以在Git工具窗口Alt 9Log选项卡中找到所需的合并提交,在右侧的“Commit Details”窗格中选择存在冲突的文件,单击“Show diff”图标在这里插入图片描述
或按Ctrl d键. 有关更多信息,请参阅查看如何合并更改

查看如何合并更改

IntelliJ IDEA允许您查看变更是如何从一个分支合并到另一个分支的,以及在合并期间冲突(如果有的话)是如何解决的:

在这里插入图片描述

  • Alt 9Git工具窗口的Log选项卡中,选择您感兴趣的合并提交。
    • 如果在合并过程中没有检测到并解决冲突,IntelliJ IDEA将在更改文件Changed Files窗格中显示相应的消息,并建议审查来自两个分支的更改:
      在这里插入图片描述
    • 从其中一个节点中选择所需的文件,然后单击工具栏上的Show Diff 在这里插入图片描述
      图标或按Ctrl DDiff Viewer将显示一个两面板的Diff,允许您将当前版本与所选父版本进行比较。
  • 如果在合并过程中发生了冲突,“已更改文件,Changed Files”窗格将显示与冲突合并的文件列表。
    从其中一个节点中选择所需的文件,然后单击工具栏上的Show Diff在这里插入图片描述
    图标或按Ctrl D. Diff Viewer将显示一个三面板的Diff,允许您将当前版本与其每个父版本进行比较,并查看冲突是如何解决的。
  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值