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