阅读(3690) (18)

Git如何解决冲突

2017-12-15 09:48:40 更新

当您在一个团队中工作的时候,当有人将更改推送到您当前正在处理的文件时,您可能会遇到这种情况。如果这些更改不重叠(即对不同的代码行进行了更改),则会自动合并冲突的文件。但是,如果同一行受到影响,则Git不能随意选择另一方,并要求您解决冲突。

在Git中,当您尝试执行下列操作之一时,冲突可能会出现: pull、merge、rebase、cherry-pick、 unstash changes或者rapply a patch。如果存在冲突,这些操作将失败,并且系统会提示您接受上游版本,首选版本或合并更改,如下图:

201712150948426508

IntelliJ IDEA提供了一个本地解决冲突的工具。该工具由三个窗格组成。左侧窗格显示只读本地副本;右窗格显示签入到存储库中的只读版本。中央窗格显示一个功能齐全的编辑器,其中显示了合并和解决冲突的结果。最初,该窗格的内容与该文件的基本修订版本相同,也就是两个冲突版本派生的版本。

Note:您可以将IntelliJ IDEA配置为始终自动应用无冲突的更改,而不是从“合并”对话框中告诉它这样做。为此,在"设置/首选项"对话框中,在左侧窗格中展开:工具| “差异合并”节点,然后选择“ 自动应用非冲突更改”选项。

要解决冲突,请执行以下操作:

  1. 在“文件合并冲突”对话框中单击“合并 ” ,或在编辑器中选择冲突的文件,然后主菜单中的选择:“VCS” |<your_VCS> | 解决冲突。
  2. 要自动合并所有非冲突的更改,请单击工具栏上的 (应用所有非冲突更改)。您也可以使用 (从左侧应用非冲突性更改)和 (从右侧应用非冲突性更改)分别从对话框的左侧/右侧部分合并非冲突性更改。
  3. 要解决冲突,您需要选择左侧(本地)和右侧(存储库)版本应用(接受 或忽略 )的操作,然后在中央窗格中检查结果代码:
    Git冲突
    对于简单的冲突(例如,如果同一行的开头和结尾已在不同的文件修订版中进行了修改),则可以使用“解决”选项,以便通过一次单击来合并更改:此类冲突不是通过"应用所有不冲突的更改" 操作解决的,因为您必须确保正确解决它们。

    Git冲突
  4. 比较不同的版本来解决冲突也可能是有用的。使用 工具栏按钮来调用选项列表。请注意,Base引用的是本地和存储库版本的文件版本(最初显示在中间的窗格中),而中间版本是指生成的版本。
  5. 在中央窗格中查看合并结果,然后单击"应用"。

您也可以右键单击冲突并使用弹出式菜单中的命令。在“使用左解析”和“使用右解析”命令解析的解决方法提供了一个快捷方式,可以从一侧接受更改,并分别从另一侧忽略它们。

您可以使用一个工具栏来管理中心窗格中的更改,当您将鼠标光标悬停在装订线上的更改标记上,然后单击它时,就会出现这种变化。工具栏与显示已修改行的前一内容的框架一起出现:

Git冲突

处理与LF和CRLF行尾相关的冲突

通常情况下,在一个团队中工作的人员使用不同的操作系统。这可能会导致行结束的问题,因为Unix,Linux和MacOS使用LF,并且Windows使用CRLF来标记行的末尾。

IntelliJ IDEA在差异查看器中显示行结尾的差异,所以您可以手动修复它们。如果您希望Git自动解决这些冲突,则需要在Windows上将core.autocrlf属性设置为true,和、并且在Linux和MacOS上将core.autocrlf属性设置为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),然后在左边选择:版本控制|Git节点。如果CRLF行分隔符即将提交,请启用“警告”选项。

启用此选项后,除非在受影响的文件中设置了任何相关的Git属性,否则IntelliJ IDEA将在每次要使用CRLF分隔符提交文件时显示“行分隔符警告对话框”(在这种情况下,IntelliJ IDEA假定您清楚地理解你在做什么,并从分析中排除这个文件)。 

在“行分隔符警告对话框”中,单击下列选项之一:

  • Commit As Is:是忽略警告并提交带有CRFL分隔符的文件。
  • Fix and Commit(修复并提交):根据您的您的操作系统将core.autocrlf属性设置为true或input。然后,CRLF行分隔符将在LF提交之前被替换。

如果稍后需要查看合并过程中的冲突究竟是如何解决的,则可以在“日志”视图中找到所需的合并提交,在右侧的“提交详细信息”窗格中选择具有冲突的文件,然后单击 或按Ctrl+D (请参阅查看更改如何合并以获取详细信息)。