📜  Git合并和合并冲突

📅  最后修改于: 2020-12-13 15:27:05             🧑  作者: Mango

Git合并和合并冲突

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

它被用来维持不同的发展路线;在某个阶段,您希望将更改合并到一个分支中。了解合并在Git中的工作方式非常重要。

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

“ git merge”命令

git merge命令用于合并分支。

git merge命令的语法如下:

$ git merge 

它可以在各种情况下使用。一些如下:

方案1:将指定的提交合并到当前活动的分支中:

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

$ git merge 

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

请参见以下示例。我在项目的文件newfile1.txt中进行了一些更改,并将其提交到测试分支中。

将要合并的特定提交复制到活动分支上,然后执行合并操作。请参见以下输出:

在上面的输出中,我们将先前的提交合并到活动分支test2中。

方案2:要将提交合并到master分支中:

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

$git log

请参见以下输出:

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

$ git checkout master

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

$ git merge master

请参见以下输出:

如以上输出所示,提交ID 2852e020909dfe705707695fd6d715cd723f9540的提交已合并到master分支中。 master分支中有两个文件已更改。但是,我们已在测试分支中进行了此提交。因此,可以合并任何分支中的任何提交。

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

方案3:Git合并分支。

Git允许将整个分支合并到另一个分支中。假设您在分支上进行了许多更改,并且希望一次合并所有这些。 Git允许您这样做。请参见以下示例:

在给定的输出中,我在测试分支的newfile1中进行了更改。现在,我已在测试分支中进行了此更改。

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

$ git merge 

从给定的输出中可以看到,分支test2的整个提交已合并到分支master。

Git合并冲突

当两个分支试图合并并且都在同一文件中同时编辑时,Git将无法识别要更改的版本。这种情况称为合并冲突。如果发生这种情况,它将在合并提交之前停止,以便您可以手动解决冲突。

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

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

借助git add命令在本地存储库中更新它。

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

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

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

现在,与此同时, user2也如下更新索引文件。

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

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

在给定的输出中,git rebase命令用于从远程URL中提取存储库。在这里,它将显示错误消息,例如中的合并冲突

解决冲突:

为了解决冲突,有必要知道冲突是否发生以及为什么发生。 Git merge工具命令用于解决冲突。 merge命令的用法如下:

$ git mergetool

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

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

$ git rebase --continue

因此,冲突得以解决。请参见以下输出:

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

要查看文件中合并冲突的第一个编辑文本,请搜索带有冲突标记<<<<<<<的文件。您可以在文本编辑器的<<<<<<< HEAD行之后的HEAD或基本分支中看到更改。接下来,您可以看到=======的分隔线。它将您的更改与另一个分支中的更改分开,后跟>>>>>>> BRANCH-NAME 。在上面的示例中,user1在base或HEAD分支中写了“

Git是一个版本控制”,而user2在该示例中写了“

Git是一个版本控制”。

确定是只保留分支的更改还是保留其他分支的更改,还是创建新更改。删除冲突标记<<<<<<<,=======,>>>>>>>并创建要合并的最终更改。