Git Merge 和合并冲突

17 Mar 2025 | 5 分钟阅读

在 Git 中,合并是将分支历史连接起来的过程。它将两个或多个开发历史合并在一起。 git merge 命令使您可以获取 git branch 创建的数据,并将它们集成到单个分支中。 Git merge 将把一系列提交关联到一个统一的历史记录中。通常,git merge 用于合并两个分支。

Git Merge and Merge Conflict

它用于维护不同的开发线路;在某个阶段,您希望合并一个分支中的更改。了解合并在 Git 中的工作方式至关重要。

在上图中,有两个分支 masterfeature。 我们可以看到,我们在功能分支和 master 分支中都做了一些提交,并将它们合并。 它的作用类似于指针。 它会在分支之间找到一个共同的基础提交。 一旦 Git 找到共享的基础提交,它将创建一个新的“合并提交”。 它结合了每个排队的合并提交序列的更改。

“git merge” 命令

git merge 命令用于合并分支。

git merge 命令的语法如下

它可以在各种上下文中使用。 有些如下:

场景1:将指定的提交合并到当前活动的 branch

使用以下命令将指定的提交合并到当前活动的 branch。

上面的命令会将指定的提交合并到当前活动的 branch。 您还可以通过在 <commit> 中传入 branch 名称,将指定的提交合并到指定的 branch。 让我们看看如何提交到当前活动的 branch。

请参见下面的示例。 我在项目的 newfile1.txt 文件中进行了一些更改,并在我的 test 分支中提交了它。

Git Merge and Merge Conflict

复制您要合并到活动 branch 的特定提交并执行合并操作。 请参见下面的输出

Git Merge and Merge Conflict

在上面的输出中,我们已将之前的提交合并到活动 branch test2 中。

场景2:将提交合并到 master branch

要将指定的提交合并到 master 中,请首先找到其提交 ID。 使用 log 命令查找特定的提交 ID。

请参见下面的输出

Git Merge and Merge Conflict

要将提交合并到 master branch 中,请切换到 master branch。

现在,切换到 branch 'master' 以对提交执行合并操作。 将 git merge 命令与 master branch 名称一起使用。 语法如下:

请参见下面的输出

Git Merge and Merge Conflict

如上面的输出所示,提交 id 为 2852e020909dfe705707695fd6d715cd723f9540 的提交已合并到 master branch 中。 master branch 中更改了两个文件。 但是,我们已经在 test 分支中进行了此提交。 因此,可以将任何提交合并到任何 branch 中。

打开新文件,您会注意到我们在 test branch 中提交的新行现在已复制到 master branch 上。

场景 3:Git 合并 branch。

Git 允许将整个 branch 合并到另一个 branch 中。 假设您在一个 branch 上进行了很多更改,并且想要一次合并所有这些更改。 Git 允许您这样做。 请参见下面的示例

Git Merge and Merge Conflict

在给定的输出中,我已在 test branch 的 newfile1 中进行了更改。 现在,我已将此更改提交到 test branch。

Git Merge and Merge Conflict

现在,切换到要合并的目标 branch。 在给定的示例中,我已切换到 master branch。 执行以下命令以将整个 branch 合并到活动 branch 中。


Git Merge and Merge Conflict

如您从给定的输出中可以看到的,branch test2 的所有提交已合并到 branch master 中。

Git 合并冲突

当两个 branch 尝试合并,并且两者同时在同一文件中进行编辑时,Git 将无法确定要采用哪个版本进行更改。 这种情况称为合并冲突。 如果发生这种情况,它将在合并提交之前停止,以便您可以手动解决冲突。

Git Merge and Merge Conflict

让我们通过一个例子来了解它。

假设我的远程存储库已由我的两个团队成员 user1user2 克隆。 user1 在我的项目的索引文件中进行了如下更改。

Git Merge and Merge Conflict

借助 git add 命令将其更新到本地存储库中。

Git Merge and Merge Conflict

现在提交更改并使用远程存储库对其进行更新。 请参见下面的输出

Git Merge and Merge Conflict

现在,我的远程存储库将如下所示

Git Merge and Merge Conflict

它将显示文件的状态,例如由谁以及何时编辑。

现在,同时,user2 也按如下方式更新了索引文件。

Git Merge and Merge Conflict

User2 已添加更改并将其提交到本地存储库。 但是,当他尝试将其推送到远程服务器时,它将引发错误。 请参见下面的输出

Git Merge and Merge Conflict

在上面的输出中,服务器知道该文件已更新且未与其他 branch 合并。 因此,推送请求被远程服务器拒绝。 它将引发类似 [rejected] failed to push some refs to <remote URL> 的错误消息。 它会建议您在推送之前先拉取存储库。 请参见以下命令

Git Merge and Merge Conflict

在给定的输出中,git rebase 命令用于从远程 URL 拉取存储库。 在这里,它将显示类似 merge conflict in <filename> 的错误消息。

解决冲突

要解决冲突,必须知道是否发生冲突以及发生冲突的原因。 Git merge tool 命令用于解决冲突。 merge 命令的使用方式如下

在我的存储库中,它将导致

Git Merge and Merge Conflict

上面的输出显示了冲突文件的状态。 要解决冲突,只需按 I 键 进入插入模式,并根据需要进行更改。 按 Esc 键 以退出插入模式。 在编辑器的底部键入: w! 以保存并退出更改。 要接受更改,请使用 rebase 命令。 它的使用方式如下

因此,冲突已解决。 请参见下面的输出

Git Merge and Merge Conflict

在上面的输出中,冲突已解决,并且本地存储库已与远程存储库同步。

要查看文件中合并冲突的第一个编辑文本是什么,请搜索附加冲突标记 <<<<<<< 的文件。 您可以在文本编辑器中的 <<<<<<< HEAD 行之后看到来自 HEAD 或基础 branch 的更改。 接下来,您可以看到分隔符,例如 =======。 它将您的更改与另一个 branch 中的更改分开,后跟 >>>>>>> BRANCH-NAME。 在上面的示例中,user1 在基础或 HEAD branch 中编写了“<h1> Git 是一个版本控制 </h1>”,而 user2 编写了“<h2> Git 是一个版本控制 </h2>”。

确定您是要仅保留 branch 的更改还是另一个 branch 的更改,或者创建新的更改。 删除冲突标记 <<<<<<<, =======, >>>>>>> 并创建您要合并的最终更改。


下一个主题Git Rebase