程序员社区

Git系列教程 --- 36、Git 的合并和合并冲突

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

file

它用于保持不同的发展路线;在某个阶段,您希望合并一个分支中的更改。了解合并在 Git 中的工作原理至关重要。

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

“git merge”命令

git merge 命令用于合并分支。

git merge 命令的语法如下:

$ git merge <query>  

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

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

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

$ git merge <commit>  

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

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

file

复制要在活动分支上合并的特定提交并执行合并操作。请参阅以下输出:

file

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

场景 2:将提交合并到主分支:

要将指定的提交合并到 master,首先要发现它的提交 id。使用 log 命令查找特定的提交 ID。

$git log  

请参阅以下输出:

file

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

$ git checkout master  

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

$ git merge master  

请参阅以下输出:

file

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

打开新文件,您会注意到我们提交给测试分支的新行现在被复制到主分支上。

场景 3:Git 合并分支。

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

file

在给定的输出中,我对 test 分支上的 newfile1 进行了更改。现在,我已经在测试分支中提交了这个更改。

file

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

$ git merge <branchname>  

file

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

Git合并冲突

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

file

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

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

file

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

file

现在提交更改并使用远程存储库更新它。请参阅以下输出:

file

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

file

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

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

file

User2 已在本地存储库中添加并提交更改。但是当他试图将它推送到远程服务器时,它会抛出错误。请参阅以下输出:

file

在上面的输出中,服务器知道该文件已经更新并且没有与其他分支合并。因此,推送请求被远程服务器拒绝。它会抛出一个错误消息,如[rejected] failed to push some refs to 。它会建议您在推送之前先拉取存储库。请参阅以下命令:

file

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

解决冲突:

要解决冲突,需要知道冲突是否发生以及为什么会发生。Git合并工具命令用于解决冲突。合并命令的使用如下:

$ git mergetool  

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

file

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

$ git rebase --continue  

因此,冲突已经解决。请参阅以下输出:

file

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

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

Git is a version control

”,而 user2 写了“

Git is a version control

”。

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

赞(0) 打赏
未经允许不得转载:IDEA激活码 » Git系列教程 --- 36、Git 的合并和合并冲突

一个分享Java & Python知识的社区