本文概述
在Git中, 合并是连接分支历史的过程。它把两个或多个开发历史联系在一起。 git merge命令可以帮助你获取git分支创建的数据并将它们集成到单个分支中。 Git合并会将一系列提交关联到一个统一的历史记录中。通常, git merge用于合并两个分支。
它被用来维持不同的发展路线;在某个阶段, 你希望将更改合并到一个分支中。了解合并在Git中的工作方式非常重要。
在上图中, 有两个分支master和feature。我们可以看到我们在功能和master分支中都进行了一些提交, 并将它们合并。它用作指针。它将在分支之间找到一个共同的基础提交。一旦Git找到一个共享的基本提交, 它将创建一个新的“合并提交”。它合并了每个排队的合并提交序列的更改。
“ git merge”命令
git merge命令用于合并分支。
git merge命令的语法如下:
$ git merge <query>
它可以在各种情况下使用。一些如下:
方案1:将指定的提交合并到当前活动的分支中:
使用以下命令将指定的提交合并到当前活动的分支。
$ git merge <commit>
上面的命令会将指定的提交合并到当前活动的分支中。你还可以通过在<commit>中传入分支名称来将指定的提交合并到指定的分支。让我们看看如何提交到当前活动的分支。
请参见以下示例。我在项目的文件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 <branchname>
从给定的输出中可以看到, 分支test2的整个提交已合并到分支master。
Git合并冲突
当两个分支试图合并, 并且同时在同一文件中对其进行编辑时, Git将无法识别要进行更改的版本。这种情况称为合并冲突。如果发生这种情况, 它将在合并提交之前停止, 以便你可以手动解决冲突。
让我们通过一个例子来理解它。
假设我的远程存储库已被团队成员user1和user2中的两个克隆。 user1在我的项目索引文件中进行了如下更改。
借助git add命令在本地存储库中更新它。
现在, 提交更改并使用远程存储库对其进行更新。请参见以下输出:
现在, 我的远程存储库将如下所示:
它将显示文件的状态, 如由谁以及何时编辑。
现在, 与此同时, user2也如下更新索引文件。
User2已添加并提交了本地存储库中的更改。但是, 当他尝试将其推送到远程服务器时, 它将引发错误。请参见以下输出:
在上面的输出中, 服务器知道该文件已经更新并且未与其他分支合并。因此, 推送请求被远程服务器拒绝。它将引发错误消息, 例如[rejected]无法将某些引用推送到<remote URL>。建议你在推送之前先拉出存储库。请参阅以下命令:
在给定的输出中, git rebase命令用于从远程URL提取存储库。在这里, 它将显示错误消息, 例如<文件名>中的合并冲突。
解决冲突
为了解决冲突, 有必要知道冲突是否发生以及为什么发生。 Git merge工具命令用于解决冲突。 merge命令的用法如下:
$ git mergetool
在我的存储库中, 它将导致:
上面的输出显示了冲突文件的状态。要解决冲突, 只需按I键进入插入模式, 然后根据需要进行更改。按Esc键退出插入模式。键入:w!在编辑器底部以保存并退出更改。要接受更改, 请使用rebase命令。它的用法如下:
$ git rebase --continue
因此, 冲突解决了。请参见以下输出:
在以上输出中, 冲突已解决, 并且本地存储库与远程存储库同步。
要查看文件中合并冲突的第一个编辑文本, 请搜索带有冲突标记<<<<<<<的文件。你可以在文本编辑器的<<<<<<< HEAD行之后的HEAD或基础分支中看到更改。接下来, 你可以看到=======的分隔符。它将你的更改与另一个分支中的更改分开, 后跟>>>>>>> BRANCH-NAME。在上面的示例中, user1在base或HEAD分支中写了“ <h1> Git是版本控制</ h1>”, 而user2在写了“ <h2> Git是版本控制</ h2>”。
确定是只保留分支的更改还是保留其他分支的更改, 还是创建新更改。删除冲突标记<<<<<<<, =======, >>>>>>>并创建要合并的最终更改。
评论前必须登录!
注册