跳至主要内容

使用命令行解决合并冲突

您可以使用命令行和文本编辑器来解决合并冲突。

平台导航

当对同一文件的同一行进行竞争性更改,或者一个人编辑文件而另一个人删除了同一个文件时,就会发生合并冲突。有关更多信息,请参阅“关于合并冲突”。

提示:您可以使用 GitHub 上的冲突编辑器来解决拉取请求中分支之间竞争性行变更合并冲突。有关更多信息,请参阅“在 GitHub 上解决合并冲突”。

竞争性行变更合并冲突

要解决由竞争性行更改引起的合并冲突,您必须选择在新的提交中合并来自不同分支的哪些更改。

例如,如果您和另一个人在同一个 Git 存储库的不同分支中对文件 styleguide.md 的同一行进行了编辑,那么在尝试合并这些分支时,您将收到合并冲突错误。您必须使用新的提交来解决此合并冲突,然后才能合并这些分支。

  1. 打开 终端终端Git Bash

  2. 导航到包含合并冲突的本地 Git 存储库。

    cd REPOSITORY-NAME
    
  3. 生成受合并冲突影响的文件列表。在本例中,文件 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")
    
  4. 打开您喜欢的文本编辑器,例如 Visual Studio Code,并导航到包含合并冲突的文件。

  5. 要查看文件中的合并冲突的开头,请搜索文件中的冲突标记 <<<<<<<。当您在文本编辑器中打开文件时,您将在 <<<<<<< HEAD 行之后看到来自 HEAD 或基分支的更改。接下来,您将看到 =======,它将您的更改与另一个分支中的更改分开,然后是 >>>>>>> BRANCH-NAME。在本例中,一个人在基分支或 HEAD 分支中写了“打开问题”,而另一个人在比较分支或 branch-a 中写了“在 IRC 中提问”。

    If you have questions, please
    <<<<<<< HEAD
    open an issue
    =======
    ask your question in IRC.
    >>>>>>> branch-a
    
  6. 决定是否保留您分支的更改、仅保留另一个分支的更改,或者进行全新的更改,这可能会合并来自两个分支的更改。删除冲突标记 <<<<<<<=======>>>>>>>,并在最终合并中进行您想要的更改。在本例中,两个更改都合并到最终合并中

    If you have questions, please open an issue or ask in our IRC channel if it's more urgent.
    
  7. 添加或暂存您的更改。

    git add .
    
  8. 使用注释提交您的更改。

    git commit -m "Resolve merge conflict by incorporating both suggestions"
    

您现在可以在命令行中合并分支,或者将您的更改推送到 GitHub 上的远程仓库,并在拉取请求中合并您的更改

已删除文件合并冲突

要解决由对文件的竞争性更改引起的合并冲突(其中一个人在一个分支中删除了一个文件,而另一个人编辑了同一个文件),您必须选择在一个新的提交中删除或保留已删除的文件。

例如,如果您编辑了一个文件,例如 README.md,而另一个人在同一个 Git 仓库的另一个分支中删除了同一个文件,那么当您尝试合并这些分支时,您将收到合并冲突错误。您必须使用新的提交解决此合并冲突,然后才能合并这些分支。

  1. 打开 终端终端Git Bash

  2. 导航到包含合并冲突的本地 Git 存储库。

    cd REPOSITORY-NAME
    
  3. 生成受合并冲突影响的文件列表。在本例中,文件 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")
    
  4. 打开您喜欢的文本编辑器,例如 Visual Studio Code,并导航到包含合并冲突的文件。

  5. 决定是否要保留已删除的文件。您可能希望在文本编辑器中查看对已删除文件的最新更改。

    要将已删除的文件添加回您的仓库

    git add README.md
    

    要从您的仓库中删除此文件

    $ git rm README.md
    > README.md: needs merge
    > rm 'README.md'
    
  6. 使用注释提交您的更改。

    $ git commit -m "Resolve merge conflict by keeping README.md file"
    > [branch-d 6f89e49] Merge branch 'branch-c' into branch-d
    

您现在可以在命令行中合并分支,或者将您的更改推送到 GitHub 上的远程仓库,并在拉取请求中合并您的更改

进一步阅读