当 Git 无法自动合并两个分支时,它会暂停并留下存在竞争的更改供你协调。在 Mac 上,使用 git status 查找受影响的文件,对比两个版本,将每个冲突编辑为经过深思熟虑的合并结果,然后暂存并完成合并。关键在于保留两处更改的意图,而不是盲目接受单方更改或假定同时保留两个区块就能生成可正常运行的代码。
确认操作并保护未完成的修改
打开终端或编辑器的内置终端,切换到代码仓库目录,并检查其状态:
cd "/path/to/repository"
git status
请使用实际的文件夹路径替换示例路径。Git 的状态会显示哪些文件未合并,以及当前操作是合并(merge)、变基(rebase)还是其他操作。本文重点介绍合并。对于普通合并,Git 会保持当前分支不动,同时等待你解决冲突;顺利合并的路径已经更新,而发生冲突的路径则需要人工审查。Git 的 git merge 文档
如果你在合并前有未提交的工作,请注意在编辑过程中不要将其覆盖。Git 文档指出 git merge --abort 是一种中止合并的方法,但也指出它可能无法完全恢复之前已存在的未提交修改。如果当前状态不明确,在继续之前请另行备份重要的本地修改。仅在确实打算中止合并时才执行 abort,并在执行后检查最终状态。Git 合并冲突说明
将每个冲突视为两项提议来解读
在文本编辑器中打开列出的每个文件。文本冲突通常以如下方式标记:
<<<<<<< HEAD
current branch version
=======
incoming branch version
>>>>>>> branch-name
======= 上方的文本通常是当前分支的版本;其下方的文本通常是要合入的分支版本。标签名称可能会有所不同。Git 会在暂存区(index)中记录共同祖先以及两个分支的版本,工作区文件中则会显示带有冲突标记的结果供你编辑。Git 合并文档
请将这两部分视为预期更改的依据,而非必须全盘接受的选择。思考每次修改旨在实现什么目的。一方可能添加了验证条件,而另一方则修改了字段名称;同时保留两者可能意味着将它们合并为一个更新后的条件。对于文件级别的冲突(例如一方删除了文件,而另一方对其进行了编辑),请决定该文件是否应该保留;如果保留,则合入所需的修改。如果仅从代码行无法看出意图,请在决定之前查看附近的代码或询问该修改的作者。
删除所有冲突标记,并编写出逻辑连贯的最终版本。切勿简单地按顺序保留两个代码块,除非程序或文档本就应当如此。同时保留两者可能会导致声明重复、行为覆盖或产生无效语法。相反,只选择一个代码块可能会丢弃另一个分支中有价值的工作成果。正确的解决方案取决于上下文环境以及每次更改的目的。
审查并暂存已解决的文件
保存编辑后的文件,然后检查更改。对于存在冲突的文件,git diff 会显示工作区中仍然存在的冲突解决工作。请检查完整的上下文,而不仅仅是带有标记的行。使用编辑器的搜索功能查找遗留的标记,或者在仓库中运行以下命令:
git grep -n -E '^(<<<<<<<|=======|>>>>>>>)'
如果找到了匹配项,请逐一检查:合法的文档或测试固件中也可能包含这些字符串,因此不要不加区分地删除匹配项。一旦文件的修改结果正确无误,即可通过向 git add 提供带引号的文件路径来暂存该文件,例如 git add "Sources/Example.swift"。暂存操作会告知 Git 该文件的冲突已解决,但并不能证明修改结果是正确的。Git 的操作规范是编辑每个冲突,添加解决冲突后的路径,然后提交或继续合并。Git 合并文档
若想在 Mac 上使用可视化工作流,Visual Studio Code 会将冲突文件列在“源代码管理”的 Merge Changes(合并更改)下。打开文件并使用其内联冲突操作,或使用 Open in Merge Editor(在合并编辑器中打开)来检查当前分支、传入分支以及最终结果。编辑器的 Accept Both Changes(保留双方更改)操作会按顺序保留两个部分;请检查生成的文件,并在需要时合并或调整内容。保存结果并在“源代码管理”中暂存该文件。这些控件属于 VS Code;其他编辑器可能会使用不同的标签或功能。VS Code 合并冲突指南
完成合并并验证结果
解决并暂存所有冲突文件后,再次检查状态:
git status
git diff --cached
审查已暂存的差异(diff),确保两个分支预期的贡献都以合理的最终形式呈现,且未混入无关修改。如果项目支持,请运行相关的测试或检查;Git 无法判断合并后的逻辑是否符合预期行为。
对于命令行合并,使用 git merge --continue 完成操作(或者在 Git 提示时提交合并)。Git 的 --continue 在创建提交前会检查是否正处于合并进程中。然后再次运行 git status,确认合并已不再进行中。如果 Git 报告了更多冲突,请同样解决并暂存这些文件。Git 合并说明
当最终文件妥善兼顾了两个分支预期的工作成果、暂存的 diff 与该结果相符,并且合并已完成时,冲突才算得到了安全解决。如果无法确定某一方的修改意图,请先暂停并获取相关背景信息,然后再决定是丢弃还是重写。
来源
Git - git-merge 文档 — Git
在 VS Code 中解决合并冲突 — Microsoft