Skip to main content

Enterprise Server 3.20 目前作为发布候选版本提供。

使用命令行解决合并冲突

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

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

提示

可以使用冲突编辑器在 GitHub 上解决作为拉取请求组成部分的各分支之间的竞争行更改合并冲突。 有关详细信息,请参阅“解决GitHub上的合并冲突”。

竞争行更改合并冲突

要解决由竞争行更改导致的合并冲突,您必须从新提交的不同分支中选择要合并的更改。

例如,如果你和另一个人都在同一 Git 仓库不同分支的同一行中编辑了 styleguide.md 文件,则在尝试合并这些分支时会发生合并冲突错误。 必须使用新提交解决这一合并冲突,然后才能合并这些分支。

  1. 进入有合并冲突的本地 Git 仓库。

    cd REPOSITORY-NAME
    
  2. 生成受合并冲突影响的文件列表。 在此示例中,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")
    
  3. 打开你首选的文本编辑器,例如 Visual Studio Code,然后导航到有合并冲突的文件。

  4. 要在文件中查看合并冲突的开头,请在文件中搜索冲突标记 <<<<<<<。 当你在文本编辑器中打开文件时,你将在行 <<<<<<< HEAD 后看到来自 HEAD 或底部分支的更改。 接下来,你将看到 =======,它用于区分您的更改和其他分支的更改,然后是 >>>>>>> BRANCH-NAME。 在本例中,一个人在基本或头部分支中编写了“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
    
  5. 决定您是否想只保持分支的更改、只保持其他分支的更改,还是进行全新的更改(可能包含两个分支的更改)。 删除冲突标记 <<<<<<<=======>>>>>>>,并在最终合并中进行所需的更改。 在本例中,两个更改均整合到最终合并:

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

    git add .
    
  7. 提交您的更改及注释。

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

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

解决了文件合并冲突

要解决由于文件的竞争性更改引起的合并冲突,当一个人删除了分支中的文件而另一个人编辑了同一文件时,您必须在新提交中选择是删除该文件还是保留被删除的文件。

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

  1. 进入有合并冲突的本地 Git 仓库。

    cd REPOSITORY-NAME
    
  2. 生成受合并冲突影响的文件列表。 在此示例中,文件 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")
    
  3. 打开你首选的文本编辑器,例如 Visual Studio Code,然后导航到有合并冲突的文件。

  4. 决定是否要保留删除的文件。 您可能想要在文本编辑器中查看对删除的文件所做的最新更改。

    要将已删除的文件重新添加到仓库:

    git add README.md
    

    要从存储库中删除此文件:

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

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

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

其他阅读材料

  •         [AUTOTITLE](/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/about-merge-conflicts)
    
  •         [AUTOTITLE](/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/checking-out-pull-requests-locally)