Git merge和合并冲突

本文概述

  • “ git merge”命令
  • Git合并冲突
  • 解决冲突
在Git中, 合并是连接分支历史的过程。它把两个或多个开发历史联系在一起。 git merge命令可以帮助你获取git分支创建的数据并将它们集成到单个分支中。 Git合并会将一系列提交关联到一个统一的历史记录中。通常, git merge用于合并两个分支。
Git merge和合并冲突

文章图片
它被用来维持不同的发展路线;在某个阶段, 你希望将更改合并到一个分支中。了解合并在Git中的工作方式非常重要。
在上图中, 有两个分支master和feature。我们可以看到我们在功能和master分支中都进行了一些提交, 并将它们合并。它用作指针。它将在分支之间找到一个共同的基础提交。一旦Git找到一个共享的基本提交, 它将创建一个新的“合并提交”。它合并了每个排队的合并提交序列的更改。
“ git merge”命令 git merge命令用于合并分支。
git merge命令的语法如下:
$ git merge < query>

它可以在各种情况下使用。一些如下:
方案1:将指定的提交合并到当前活动的分支中:
【Git merge和合并冲突】使用以下命令将指定的提交合并到当前活动的分支。
$ git merge < commit>

上面的命令会将指定的提交合并到当前活动的分支中。你还可以通过在< commit> 中传入分支名称来将指定的提交合并到指定的分支。让我们看看如何提交到当前活动的分支。
请参见以下示例。我在项目的文件newfile1.txt中进行了一些更改, 并将其提交到测试分支中。
Git merge和合并冲突

文章图片
将要合并的特定提交复制到活动分支上, 然后执行合并操作。请参见以下输出:
Git merge和合并冲突

文章图片
在上面的输出中, 我们将先前的提交合并到活动分支test2中。
方案2:要将提交合并到master分支中:
要将指定的提交合并到主提交中, 请首先发现其提交ID。使用log命令查找特定的提交ID。
$git log

请参见以下输出:
Git merge和合并冲突

文章图片
要将提交合并到master分支中, 请切换到master分支。
$ git checkout master

现在, 切换到分支“ master”对提交执行合并操作。将git merge命令与主分支名称一起使用。语法如下:
$ git merge master

请参见以下输出:
Git merge和合并冲突

文章图片
如上面的输出所示, 提交ID 2852e020909dfe705707695fd6d715cd723f9540的提交已合并到master分支中。 master分支中有两个文件已更改。但是, 我们已在测试分支中进行了此提交。因此, 可以合并任何分支中的任何提交。
打开新文件, 你会注意到我们已经提交给test分支的新行现在已复制到master分支上。
方案3:Git合并分支。
Git允许将整个分支合并到另一个分支中。假设你在分支上进行了许多更改, 并且希望一次合并所有这些。 Git允许你这样做。请参见以下示例:
Git merge和合并冲突

文章图片
在给定的输出中, 我在测试分支的newfile1中进行了更改。现在, 我已在测试分支中进行了此更改。
Git merge和合并冲突

文章图片
现在, 切换到要合并的所需分支。在给定的示例中, 我已切换到master分支。执行以下命令, 将整个分支合并到活动分支中。
$ git merge < branchname>

Git merge和合并冲突

文章图片
从给定的输出中可以看到, 分支test2的整个提交已合并到分支master。
Git合并冲突 当两个分支试图合并, 并且同时在同一文件中对其进行编辑时, Git将无法识别要进行更改的版本。这种情况称为合并冲突。如果发生这种情况, 它将在合并提交之前停止, 以便你可以手动解决冲突。
Git merge和合并冲突

文章图片
让我们通过一个例子来理解它。
假设我的远程存储库已被团队成员user1和user2中的两个克隆。 user1在我的项目索引文件中进行了如下更改。
Git merge和合并冲突

文章图片
借助git add命令在本地存储库中更新它。
Git merge和合并冲突

文章图片
现在, 提交更改并使用远程存储库对其进行更新。请参见以下输出:
Git merge和合并冲突

文章图片
现在, 我的远程存储库将如下所示:
Git merge和合并冲突

文章图片
它将显示文件的状态, 如由谁以及何时编辑。
现在, 与此同时, user2也如下更新索引文件。
Git merge和合并冲突

文章图片
User2已添加并提交了本地存储库中的更改。但是, 当他尝试将其推送到远程服务器时, 它将引发错误。请参见以下输出:
Git merge和合并冲突

文章图片
在上面的输出中, 服务器知道该文件已经更新并且未与其他分支合并。因此, 推送请求被远程服务器拒绝。它将引发错误消息, 例如[rejected]无法将某些引用推送到< remote URL> 。建议你在推送之前先拉出存储库。请参阅以下命令:
Git merge和合并冲突

文章图片
在给定的输出中, git rebase命令用于从远程URL提取存储库。在这里, 它将显示错误消息, 例如< 文件名> 中的合并冲突。
解决冲突 为了解决冲突, 有必要知道冲突是否发生以及为什么发生。 Git merge工具命令用于解决冲突。 merge命令的用法如下:
$ git mergetool

在我的存储库中, 它将导致:
Git merge和合并冲突

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

因此, 冲突解决了。请参见以下输出:
Git merge和合并冲突

文章图片
在以上输出中, 冲突已解决, 并且本地存储库与远程存储库同步。
要查看文件中合并冲突的第一个编辑文本, 请搜索带有冲突标记< < < < < < < 的文件。你可以在文本编辑器的< < < < < < < HEAD行之后的HEAD或基础分支中看到更改。接下来, 你可以看到=======的分隔符。它将你的更改与另一个分支中的更改分开, 后跟> > > > > > > BRANCH-NAME。在上面的示例中, user1在base或HEAD分支中写了“ < h1> Git是版本控制< / h1> ”, 而user2在写了“ < h2> Git是版本控制< / h2> ”。
确定是只保留分支的更改还是保留其他分支的更改, 还是创建新更改。删除冲突标记< < < < < < < , =======, > > > > > > > 并创建要合并的最终更改。

    推荐阅读