Git 允许您组合在两个不同分支上创建的更改。实现此目的的一种方法是合并,本章对此进行了介绍。您可以根据分支、标签或提交进行合并。其他方法是使用衍合或樱桃采摘。
本部分说明如何在假设不会发生合并冲突的情况下合并两个不同分支之间的更改
快进合并
如果合并的提交是当前分支的 HEAD 指针的直接继承者,Git 将执行所谓的快进合并。此快进合并仅将当前分支的 HEAD 指针移动到要合并的分支的顶端。
下图描述了此过程。第一张图片假定主分支已检出,并且您希望将标记为“分支 1”的分支的更改合并到“主”分支中。每个提交都指向其前置任务(父级)。 快进合并后,HEAD 指向指向“提交 3”的主分支。“分支 1”分支指向同一提交。
合并提交
如果合并的提交不是当前分支的直接前置任务,Git 将基于两个分支的最新常见前置任务,在两个分支的最新共同前置任务之间执行所谓的三向合并。 因此,在当前分支上创建了所谓的合并提交。它结合了要合并的两个分支的相应更改。此提交指向其两个前身。 如果存在多个公共前置任务,Git 将使用递归来创建虚拟通用前置任务。为此,Git 会创建一个共同祖先的合并树,并将其用作 3 向合并的参考。这称为递归合并策略,是默认的合并策略。
合并策略
如果无法进行快进合并,Git 将使用合并策略。称为递归合并策略的默认策略在合并提交中进行了描述。
Git 命令行工具还支持用于合并多个引用的 Octopus 合并策略。通过此操作,它可以一次合并多个分支。
当您想要将另一个项目合并到当前项目的子目录中时,该选项很有用。 该策略合并一个分支,而不查看此分支中引入的更改。这将保留合并分支的历史记录,但忽略此分支中引入的更改。ours
您可以使用我们的合并策略来记录您已集成分支并决定忽略此分支的所有更改。
使用 git merge 命令
该命令执行合并。您可以通过以下命令将更改从一个分支合并到当前活动分支。git merge
# syntax: git merge <branch-name>
# merges into your currently checked out branch
git merge testing
指定合并策略
该参数允许您指定其他合并策略。-s
例如,您可以指定 ours 策略,其中合并的结果始终是当前分支头的结果,从而有效地忽略来自所有其他分支的所有更改。以下命令对此进行了演示。
# merge branch "obsolete" ignoring all
# changes in the branch
git merge -s ours obsolete
如果您使用我们的合并策略,请小心,它会忽略合并的分支中的所有内容。
如果您指定多个要合并的引用,则会触发八达通合并策略的使用。
# merge the branch1 and the branch2 using
# changes in the branch
git merge branch1 branch2
为默认合并策略指定参数
递归合并策略(默认)允许您使用参数指定标志。例如,您可以指定该选项。此选项强制通过偏爱本地版本来自动解决冲突的更改。来自其他分支的与本地版本不冲突的更改将保留在合并结果中。对于二进制文件,整个内容取自本地版本。-Xours
递归合并策略的选项不应与我们的合并策略混淆。ours
与 选项类似的选项。此选项首选合并的分支中的版本。ourstheirs
下面的示例代码演示了这两个选项。
# merge changes preferring our version
git merge -s recursive -X ours [branch_to_merge]
# merge changes preferring the version from
# the branch to merge
git merge -s recursive -X theirs [branch_to_merge]
另一个有用的选项是忽略空格更改的参数。ignore-space-change
强制创建合并提交
如果您更喜欢合并提交,即使在 Git 可以执行快进合并的情况下,也可以使用该命令。git merge --no-ff
如果要在历史记录中记录从维护分支合并到主分支的时间,则该参数可能有意义。–no-ff
从远程存储库提取时,最好对合并进行重定基。这将有助于使历史记录更易于阅读。合并提交有助于记录并行开发的功能。
|