Git - 合并冲突



在 Git 中合并分支

合并是将一个分支的更改集成到另一个分支的过程。在单独的分支上开发功能或修复错误后,通常会将该分支合并回主分支,以将这些更改包含在主代码库中。

处理合并冲突

分支合并并不总是按计划进行。如果 **auth-module** 分支和 **bugfix** 分支都对同一文件的同一部分进行了不同的编辑,则 Git 会遇到合并冲突。

这就是它的表现方式

$ git merge auth-module
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

Git 报告 `index.html` 文件中的冲突并停止合并过程。

它等待我们手动解决冲突,通过编辑文件而不是自动创建新的合并提交。

我们可以使用 **git status** 查看哪些文件存在冲突

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add ..." to mark resolution)

    both modified:      index.html

no changes added to commit (use "git add" and/or "git commit -a")

当 Git 在合并期间发现冲突的更改时,它会将受影响的文件标记为未合并,并在文件中添加冲突标记以识别冲突的部分。

`index.html` 中的冲突部分可能如下所示

<<<<<<< HEAD:index.html
<header>
  <h1>Welcome to our Website</h1>
</header>
=======
<header>
  <h1>Welcome to the Best Website</h1>
</header>
 >>>>>>> feature/update-header:index.html

在上面的示例中

  • 冲突表明 `index.html` 标题部分中的 <h1> 标签已被 feature/update-header 分支和 master 分支 (**HEAD**) 不一致地修改。

  • 我们必须手动编辑文件以决定保留哪些更改以及如何合并它们,以解决此冲突。

  • 例如,我们可以选择通过修改 `index.html` 以包含这两个概念来合并修改。

<header>
  <h1>Welcome to our Website</h1>
</header>

在解决 `index.html` 中的冲突后,我们应该从文件中删除冲突标记 (**\\\<<<\, =======, 和 >>>>>>**)。

接下来,使用 **git add** 暂存文件并将其标记为已解决在 Git 中。

$ git add index.html

在所有冲突文件都已暂存后,接下来提交合并。

$ git commit

如果我们更愿意使用图形工具,可以使用 **git mergetool** 启动一个可视化合并工具,以帮助解决冲突。

$ git mergetool
This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare vimdiff emerge
Merging:
index.html

Normal merge conflict for 'index.html':
  {local}: modified file
  {remote}: modified file
Hit return to start merge resolution tool (opendiff):
  • 一旦我们使用指定的工具解决冲突并关闭窗口,Git 会要求我们验证合并是否成功。

  • 如果收到确认,Git 会自动暂存已解决的文件并将其标记为已解决。

  • 通过再次运行 git status,我们可以确认冲突的状态。

$ git status
On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   index.html

一旦确保所有冲突都已处理并暂存,使用 **git commit** 将完成合并提交。

通常,默认提交消息类似于以下内容

    Merge branch 'feature/auth-module'

Conflicts:
    index.html

# It seems like you're committing a merge.
# If this isn't correct, please remove the file
# .git/MERGE_HEAD and try again.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# All conflicts fixed but you are still merging.
#
# Changes to be committed:
#   modified:   index.html
广告