Git Merge 和合并冲突17 Mar 2025 | 5 分钟阅读 在 Git 中,合并是将分支历史连接起来的过程。它将两个或多个开发历史合并在一起。 git merge 命令使您可以获取 git branch 创建的数据,并将它们集成到单个分支中。 Git merge 将把一系列提交关联到一个统一的历史记录中。通常,git merge 用于合并两个分支。 ![]() 它用于维护不同的开发线路;在某个阶段,您希望合并一个分支中的更改。了解合并在 Git 中的工作方式至关重要。 在上图中,有两个分支 master 和 feature。 我们可以看到,我们在功能分支和 master 分支中都做了一些提交,并将它们合并。 它的作用类似于指针。 它会在分支之间找到一个共同的基础提交。 一旦 Git 找到共享的基础提交,它将创建一个新的“合并提交”。 它结合了每个排队的合并提交序列的更改。 “git merge” 命令git merge 命令用于合并分支。 git merge 命令的语法如下 它可以在各种上下文中使用。 有些如下: 场景1:将指定的提交合并到当前活动的 branch 使用以下命令将指定的提交合并到当前活动的 branch。 上面的命令会将指定的提交合并到当前活动的 branch。 您还可以通过在 <commit> 中传入 branch 名称,将指定的提交合并到指定的 branch。 让我们看看如何提交到当前活动的 branch。 请参见下面的示例。 我在项目的 newfile1.txt 文件中进行了一些更改,并在我的 test 分支中提交了它。 ![]() 复制您要合并到活动 branch 的特定提交并执行合并操作。 请参见下面的输出 ![]() 在上面的输出中,我们已将之前的提交合并到活动 branch test2 中。 场景2:将提交合并到 master branch 要将指定的提交合并到 master 中,请首先找到其提交 ID。 使用 log 命令查找特定的提交 ID。 请参见下面的输出 ![]() 要将提交合并到 master branch 中,请切换到 master branch。 现在,切换到 branch 'master' 以对提交执行合并操作。 将 git merge 命令与 master branch 名称一起使用。 语法如下: 请参见下面的输出 ![]() 如上面的输出所示,提交 id 为 2852e020909dfe705707695fd6d715cd723f9540 的提交已合并到 master branch 中。 master branch 中更改了两个文件。 但是,我们已经在 test 分支中进行了此提交。 因此,可以将任何提交合并到任何 branch 中。 打开新文件,您会注意到我们在 test branch 中提交的新行现在已复制到 master branch 上。 场景 3:Git 合并 branch。 Git 允许将整个 branch 合并到另一个 branch 中。 假设您在一个 branch 上进行了很多更改,并且想要一次合并所有这些更改。 Git 允许您这样做。 请参见下面的示例 ![]() 在给定的输出中,我已在 test branch 的 newfile1 中进行了更改。 现在,我已将此更改提交到 test branch。 ![]() 现在,切换到要合并的目标 branch。 在给定的示例中,我已切换到 master branch。 执行以下命令以将整个 branch 合并到活动 branch 中。 ![]() 如您从给定的输出中可以看到的,branch test2 的所有提交已合并到 branch master 中。 Git 合并冲突当两个 branch 尝试合并,并且两者同时在同一文件中进行编辑时,Git 将无法确定要采用哪个版本进行更改。 这种情况称为合并冲突。 如果发生这种情况,它将在合并提交之前停止,以便您可以手动解决冲突。 ![]() 让我们通过一个例子来了解它。 假设我的远程存储库已由我的两个团队成员 user1 和 user2 克隆。 user1 在我的项目的索引文件中进行了如下更改。 ![]() 借助 git add 命令将其更新到本地存储库中。 ![]() 现在提交更改并使用远程存储库对其进行更新。 请参见下面的输出 ![]() 现在,我的远程存储库将如下所示 ![]() 它将显示文件的状态,例如由谁以及何时编辑。 现在,同时,user2 也按如下方式更新了索引文件。 ![]() User2 已添加更改并将其提交到本地存储库。 但是,当他尝试将其推送到远程服务器时,它将引发错误。 请参见下面的输出 ![]() 在上面的输出中,服务器知道该文件已更新且未与其他 branch 合并。 因此,推送请求被远程服务器拒绝。 它将引发类似 [rejected] failed to push some refs to <remote URL> 的错误消息。 它会建议您在推送之前先拉取存储库。 请参见以下命令 ![]() 在给定的输出中,git rebase 命令用于从远程 URL 拉取存储库。 在这里,它将显示类似 merge conflict in <filename> 的错误消息。 解决冲突要解决冲突,必须知道是否发生冲突以及发生冲突的原因。 Git merge tool 命令用于解决冲突。 merge 命令的使用方式如下 在我的存储库中,它将导致 ![]() 上面的输出显示了冲突文件的状态。 要解决冲突,只需按 I 键 进入插入模式,并根据需要进行更改。 按 Esc 键 以退出插入模式。 在编辑器的底部键入: w! 以保存并退出更改。 要接受更改,请使用 rebase 命令。 它的使用方式如下 因此,冲突已解决。 请参见下面的输出 ![]() 在上面的输出中,冲突已解决,并且本地存储库已与远程存储库同步。 要查看文件中合并冲突的第一个编辑文本是什么,请搜索附加冲突标记 <<<<<<< 的文件。 您可以在文本编辑器中的 <<<<<<< HEAD 行之后看到来自 HEAD 或基础 branch 的更改。 接下来,您可以看到分隔符,例如 =======。 它将您的更改与另一个 branch 中的更改分开,后跟 >>>>>>> BRANCH-NAME。 在上面的示例中,user1 在基础或 HEAD branch 中编写了“<h1> Git 是一个版本控制 </h1>”,而 user2 编写了“<h2> Git 是一个版本控制 </h2>”。 确定您是要仅保留 branch 的更改还是另一个 branch 的更改,或者创建新的更改。 删除冲突标记 <<<<<<<, =======, >>>>>>> 并创建您要合并的最终更改。 下一个主题Git Rebase |
我们请求您订阅我们的新闻通讯以获取最新更新。