将独立开发的代码线,通常位于不同分支上,合并回主分支(例如 main 或 master),是协作项目中一个常见的目标。这种组合不同分支的历史和更改的过程称为合并。Git 提供了 git merge 命令,专门用于此目的。合并会将源分支(例如您的功能分支)的更改与目标分支(例如 main 分支)的历史结合起来。Git 在自动组合这些更改方面表现出色。git merge 命令要执行合并,您首先需要切换到您想要将其他分支合并进来的分支。这通常是您的主要开发线,例如 main 分支。一旦您位于目标分支上,就可以使用 git merge 命令,并指定您想要从中合并出来的分支的名称。例如,如果您已经完成了 new-feature 分支上的工作,并希望将这些更改整合到您的 main 分支中,您可以运行以下命令:切换到目标分支(main):git switch main或者,使用旧命令:git checkout main将源分支(new-feature)合并到当前分支(main):git merge new-feature合并的工作方式当您执行 git merge 时,Git 在后台执行几个步骤:确定基础: Git 会回溯两个分支(当前分支和要合并的分支)的历史,以找到最佳共同祖先提交。这是两个分支最初分歧的点。计算更改: Git 会确定自该共同祖先以来每个分支上所做的更改。组合更改: 它会尝试组合这些更改集。如果更改发生在文件的不同部分或完全不同的文件中,Git 通常可以自动组合它们而没有任何问题。合并提交通常,当自两个分支分歧以来,两个分支都发生了更改时,Git 会创建一个新的特殊提交,称为合并提交。此提交充当项目历史中的一个统一衔接点。它的标志性特征是它有多个父提交:一个指向您所在分支(例如 main)的最新提交,另一个指向您合并进来的分支(例如 new-feature)的最新提交。此合并提交本身不引入新的文件更改(除非需要解决冲突),而是作为一个记录,表明两个分支的历史在此处合并。digraph G { rankdir=LR; node [shape=circle, style=filled, fillcolor="#dee2e6", fontname="Arial", fixedsize=true, width=0.5, height=0.5]; edge [arrowhead=vee, color="#495057"]; // 提交 A [label="A"]; B [label="B", fillcolor="#96f2d7"]; // main 分支上的提交 C [label="C", fillcolor="#a5d8ff"]; // feature 分支上的提交 D [label="D", fillcolor="#a5d8ff"]; // feature 分支上的提交 M [label="M", fillcolor="#ffec99", shape=doublecircle]; // 合并提交 // 结构 A -> B [label=" main", fontcolor="#0ca678"]; A -> C [label=" new-feature", fontcolor="#1c7ed6"]; C -> D; B -> M [xlabel=" ", headlabel="main"]; // 合并提交的父提交 1 D -> M; // 合并提交的父提交 2 // 大致对齐分支末端 { rank = same; B; D; M } }合并提交 (M) 组合了来自两个父提交(main 分支上的 B,new-feature 分支上的 D)的工作,整合了分叉的历史。main 标签现在指向 M。在 main 分支上运行 git merge new-feature 后,Git 可能会输出消息,表示哪些文件已更改并确认合并提交的创建(如果有必要)。您的 main 分支现在包含了 new-feature 分支上完成的所有工作。合并是 Git 中整合工作的一项基本操作。虽然它通常运行顺畅,但有时 Git 会遇到合并分支上的更改相互冲突的情况。我们将在后续章节中讨论 Git 如何处理更简单的合并场景(快进合并)以及如何解决冲突。