Git 合并和合并冲突
在Git中,合并是将分叉的历史连接在一起的过 程。它将两个或更多的开发历史连接在一起。git merge命令使您能够将由git branch创建的数据集成到一个单一的分支中。Git合并将一系列提交关联到一个统一的历史上。通常,git merge用于合并两个分支。
它被用来维护不同的开发分支;在某个阶段,你想要合并一个分支中的变更。了解Git中的合并如何工作非常重要。
在上图中,有两个分支 master 和 feature 。我们可以看到我们在功能和master分支上做了一些提交,并将它们合并。它的工作方式就像一个指针,它会找到分支之间的共同基础提交。一旦Git找到了共享的基础提交,它将创建一个新的”合并提交”,它将合并每个队列中的合并提交序列的变更。
“git merge”命令
git merge命令用于合并分支。
git merge命令的语法如下:
$ git merge <query>
它可以应用于各种情境。以下是一些例子:
场景1:将指定的提交合并到当前活跃的分支:
使用以下命令将指定的提交合并到当前活跃的分支。
$ git merge <commit>
上述命令将指定的提交合并到当前活动的分支中。您还可以通过在
请参考以下示例。我在我的项目文件 newfile1.txt 中做了一些更改,并将其提交到我的 test 分支。
复制您想要合并到活动分支上的特定提交,并执行合并操作。请参阅以下输出:
场景2:将提交合并到主分支中:
要将指定的提交合并到主分支中,首先要找到它的提交ID。可以使用日志命令来找到特定的提交ID。
$git log
查看下面的输出:
将提交合并到主分支中,请切换到主分支。
$ git checkout master
现在,切换到’master’分支上执行合并操作。使用git merge命令以及’master’分支名称。其语法如下:
$ git merge master
查看下面的输出:
在给定的输出中,我在测试分支上对newfile1进行了更改。现在,我已经在测试分支上提交了这个更改。
现在,切换到您想要合并的目标分支。在给定的示例中,我已经切换到主分支。执行下面的命令,将整个分支合并到活动分支中。
$ git merge <branchname>
正如您从给定的输出中可以看到的,分支test2的所有提交已合并到分支master。
Git合并冲突
当两个分支尝试合并且同时编辑同一个文件时,Git无法识别应采用哪个版本的更改。这种情况被称为合并冲突。如果出现这种情况,Git会在合并提交之前停止,以便您可以手动解决冲突。
通过一个例子来理解。
假设我的远程仓库被我的两个团队成员 user1 和 user2 克隆了。用户1在我的项目索引文件中进行了如下更改:
使用git add命令将其更新到本地仓库中。
现在提交更改并将其更新到远程仓库。请参阅以下输出:
现在,我的远程仓库将会是这样的:
它将显示文件的编辑状态,包括由谁何时编辑。
现在,同时, user2 也更新了索引文件如下。
用户2已经添加并提交了本地仓库中的更改。但是当他尝试将其推送到远程服务器时,会抛出错误。请参见下面的输出:
在上述输出中,服务器知道该文件已经更新,而且没有与其他分支合并。所以,推送请求被远程服务器拒绝了。它会抛出一个错误消息,类似于 **[rejected] failed to push some refs to
在给定的输出中,git rebase命令被用来从远程URL拉取仓库。在这里,它将显示如下的错误信息: 合并冲突在 <filename>
。
解决冲突
为了解决冲突,有必要知道冲突是否发生以及为什么它发生。Git合并工具命令被用于解决冲突。合并命令的使用方式如下:
$ git mergetool
在我的存储库中,这将导致:
上述输出显示了冲突文件的状态。要解决冲突,只需按下 I 键 进入插入模式,并根据需要进行更改。按下 Esc 键 退出插入模式。在编辑器底部输入 w! 来保存并退出更改。要接受更改,使用rebase命令。使用方法如下:
$ git rebase --continue
因此,冲突已经解决。请看下面的输出:
在上述输出中,冲突已解决,本地仓库与远程仓库同步。
要查看文件中第一个编辑的合并冲突文本,搜索带有冲突标记的文件 < <<<<<<
。您可以在文本编辑器中查看行 < <<<<<< HEAD
之后的更改,从 HEAD 或基本分支中查看更改。接下来,您可以看到分隔符 =======
,它将您的更改与其他分支的更改分开,紧接着是 > >>>>>> BRANCH-NAME
。在上面的示例中,user1在基本或HEAD分支中写入了”<h1>Git是一个版本控制</h1>
“,而user2在其他分支中写入了”<h2>Git是一个版本控制</h2>
“。
决定是保留您分支的更改还是其他分支的更改,或创建新的更改。删除冲突标记 < <<<<<<, =======, >>>>>>>
并创建您想要合并的最终更改。