当对同一文件的同一行进行竞争性更改时,或者当一个人编辑文件而另一个人删除同一文件时,就会发生合并冲突。有关详细信息,请参阅“关于合并冲突”。
提示:你可以使用 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 分支中写了“打开一个问题”,而另一个人在比较分支或branch-a
中写了“在 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 存储库中的另一个分支中删除了同一个文件,那么当你尝试合并这些分支时,你将收到合并冲突错误。你必须使用新提交解决此合并冲突,然后才能合并这些分支。
-
打开 终端终端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 上的远程存储库,并在拉取请求中合并你的更改。