当对同一文件的同一行进行竞争性更改,或当一个人编辑文件而另一人删除同一文件时,就会出现合并冲突。更多信息,请参阅 关于合并冲突。
提示
您可以使用 GitHub 上的冲突编辑器来解决拉取请求中分支之间的竞争行更改合并冲突。更多信息,请参阅 在 GitHub 上解决合并冲突。
竞争行更改合并冲突
要解决由竞争行更改引起的合并冲突,必须在新的提交中选择要从不同分支合并的更改。
例如,如果您和另一位同事在同一 Git 仓库的不同分支上同时编辑了文件 styleguide.md 的同一行,在尝试合并这些分支时会出现合并冲突错误。必须先用新的提交来解决此合并冲突,才能合并这些分支。
-
打开 终端终端Git Bash。
-
进入出现合并冲突的本地 Git 仓库。
cd REPOSITORY-NAME -
生成受合并冲突影响的文件列表。本例中,文件 styleguide.md 存在合并冲突。
$ git status > # On branch branch-b > # You have unmerged paths. > # (fix conflicts and run "git commit") > # > # Unmerged paths: > # (use "git add <file>..." to mark resolution) > # > # both modified: styleguide.md > # > no changes added to commit (use "git add" and/or "git commit -a") -
打开您喜欢的文本编辑器,例如 Visual Studio Code,并定位到出现合并冲突的文件。
-
要查看文件中合并冲突的起始位置,请搜索冲突标记
<<<<<<<。在文本编辑器中打开文件后,您会在<<<<<<< HEAD这一行后看到 HEAD(或基准)分支的更改。随后会出现=======,它将您的更改与另一个分支的更改分开,随后是>>>>>>> BRANCH-NAME。本例中,基准/HEAD 分支的一位作者写了 “open an issue”,而比较分支branch-a的另一位作者写了 “ask your question in IRC”。If you have questions, please <<<<<<< HEAD open an issue ======= ask your question in IRC. >>>>>>> branch-a -
决定是仅保留您所在分支的更改、仅保留另一分支的更改,还是创建全新的更改(可能合并两个分支的内容)。删除冲突标记
<<<<<<<、=======、>>>>>>>,并在最终合并中留下您想要的内容。此示例中,两种更改都被合并到最终结果。If you have questions, please open an issue or ask in our IRC channel if it's more urgent. -
添加或暂存您的更改。
git add . -
使用备注提交您的更改。
git commit -m "Resolve merge conflict by incorporating both suggestions"
现在,您可以在命令行上合并分支,或 将更改推送到远程仓库(GitHub),并在拉取请求中 合并您的更改。
已删除文件合并冲突
要解决因文件竞争性更改而产生的合并冲突(即某人在一个分支中删除文件,而另一人在另一个分支中编辑同一文件),必须在新的提交中决定是删除还是保留该文件。
例如,如果您编辑了文件 README.md,而另一位同事在同一仓库的另一个分支中删除了该文件,在尝试合并这些分支时会出现合并冲突错误。必须先用新的提交解决此合并冲突,才能合并这些分支。
-
打开 终端终端Git Bash。
-
进入出现合并冲突的本地 Git 仓库。
cd REPOSITORY-NAME -
生成受合并冲突影响的文件列表。本例中,文件
README.md存在合并冲突。$ git status > # On branch main > # Your branch and 'origin/main' have diverged, > # and have 1 and 2 different commits each, respectively. > # (use "git pull" to merge the remote branch into yours) > # You have unmerged paths. > # (fix conflicts and run "git commit") > # > # Unmerged paths: > # (use "git add/rm <file>..." as appropriate to mark resolution) > # > # deleted by us: README.md > # > # no changes added to commit (use "git add" and/or "git commit -a") -
打开您喜欢的文本编辑器,例如 Visual Studio Code,并定位到出现合并冲突的文件。
-
决定是否保留被删除的文件。您可能需要在文本编辑器中查看该文件的最新更改。
将被删除的文件重新添加到仓库
git add README.md从仓库中删除此文件
$ git rm README.md > README.md: needs merge > rm 'README.md' -
使用备注提交您的更改。
$ git commit -m "Resolve merge conflict by keeping README.md file" > [branch-d 6f89e49] Merge branch 'branch-c' into branch-d
现在,您可以在命令行上合并分支,或 将更改推送到远程仓库(GitHub),并在拉取请求中 合并您的更改。