如何在不使用快进选项的情况下合并 Git 分支

GitGitBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

Git 是一个强大的版本控制系统,它允许开发者有效地管理代码更改。一个常见的场景是合并分支,当合并不是简单的快进合并时,有时会具有挑战性。本教程将指导你完成非快进合并 Git 分支的过程,帮助你保持提交历史的清晰和有条理。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/BranchManagementGroup -.-> git/branch("Handle Branches") git/BranchManagementGroup -.-> git/checkout("Switch Branches") git/BranchManagementGroup -.-> git/merge("Merge Histories") git/BranchManagementGroup -.-> git/rebase("Reapply Commits") subgraph Lab Skills git/branch -.-> lab-415261{{"如何在不使用快进选项的情况下合并 Git 分支"}} git/checkout -.-> lab-415261{{"如何在不使用快进选项的情况下合并 Git 分支"}} git/merge -.-> lab-415261{{"如何在不使用快进选项的情况下合并 Git 分支"}} git/rebase -.-> lab-415261{{"如何在不使用快进选项的情况下合并 Git 分支"}} end

理解 Git 分支

Git 分支是版本控制系统中的一个基本概念。一个分支代表一条独立的开发线路,它允许开发者同时处理不同的功能或修复不同的漏洞,而不会影响主代码库。了解 Git 分支的工作原理对于有效地管理软件项目并进行协作至关重要。

什么是 Git 分支?

Git 分支本质上是指向仓库历史中特定提交的指针。当你创建一个新分支时,Git 会创建一个新的指针,该指针可以独立于其他分支移动。这使你能够在不影响主代码库(通常由 mastermain 分支表示)的情况下,处理不同的功能或修复漏洞。

分支工作流程

常见的 Git 分支工作流程是为你正在处理的每个功能或漏洞修复创建一个新分支。这有助于将你的更改隔离开来,并在准备好时更容易将它们合并回主代码库。典型的分支工作流程包括以下步骤:

  1. 创建一个新分支:使用 git checkout -b <分支名称> 命令创建一个新分支并切换到该分支。
  2. 处理你的更改:使用 git addgit commit 将你的更改提交到新分支。
  3. 更新主分支:如果自你创建分支以来主分支已更新,你可能需要使用 git merge <主分支> 将这些更改合并到你的分支中。
  4. 合并你的更改:当你的功能或漏洞修复准备好时,你可以使用 git merge <你的分支> 将你的分支合并到主分支中。

分支可视化

为了更好地理解 Git 分支的工作原理,可视化仓库的提交历史会很有帮助。你可以使用 git log --graph --oneline --all 这样的工具来查看分支结构和提交历史的图形表示。

graph LR A[初始提交] --> B[功能分支] A --> C[热修复分支] B --> D[合并后的功能] C --> E[合并后的热修复] D --> F[主分支] E --> F

此图展示了一个简单的 Git 分支历史,其中创建了一个 功能分支 和一个 热修复分支,之后它们被合并回了 主分支

理解 Git 分支以及如何有效地管理它们对于协作软件开发至关重要。通过掌握分支管理,你可以简化工作流程、维护代码稳定性并实现高效的团队合作。

非快进合并分支

在合并 Git 分支时,默认行为是执行 “快进” 合并,当你要合并的目标分支自你要合并的分支创建以来没有分歧时就会发生这种情况。然而,在某些情况下,你可能希望避免快进合并,而是创建一个新的合并提交。

理解快进合并

当你要合并的目标分支自你要合并的分支创建以来没有任何新提交时,就会发生快进合并。在这种情况下,Git 可以简单地将分支指针 “快进” 到你要合并的分支上的最新提交,而无需创建新的合并提交。

graph LR A[初始提交] --> B[功能分支] B --> C[快进合并]

避免快进合并

在某些情况下,你可能希望避免快进合并,而是创建一个新的合并提交。当你想要保持清晰的提交历史记录,或者当你要合并分歧较大的分支时,这可能会很有用。

要避免快进合并,你可以在合并分支时使用 --no-ff(或 -n)选项:

git merge --no-ff <分支名称>

即使可以进行快进合并,这也会创建一个新的合并提交。

graph LR A[初始提交] --> B[功能分支] A --> C[热修复分支] B --> D[非快进合并] C --> D

合并策略

Git 提供了几种合并策略,你可以使用这些策略来控制分支的合并方式。一些常见的策略包括:

  • 递归:默认的合并策略,执行三方合并。
  • 我们的:选择当前分支的版本,忽略另一个分支的更改。
  • 他们的:选择另一个分支的版本,忽略当前分支的更改。

你可以在合并时使用 -s 选项指定合并策略:

git merge -s <策略> <分支名称>

了解如何进行非快进合并分支是管理复杂 Git 工作流程和保持清晰提交历史记录的一项重要技能。

应用合并策略

Git 提供了几种合并策略,可用于控制分支的合并方式。了解这些策略以及何时使用它们有助于你管理复杂的 Git 工作流程并保持清晰的提交历史记录。

递归合并策略

recursive 策略是 Git 的默认合并策略。它执行三方合并,将两个分支的更改与其共同祖先合并。这是最常用的合并策略,适用于大多数情况。

graph LR A[共同祖先] --> B[分支 1] A --> C[分支 2] B --> D[递归合并] C --> D

我们的合并策略

ours 策略选择当前分支的版本,忽略另一个分支的更改。当你想保留当前分支的更改并丢弃另一个分支的更改时,这可能会很有用。

git merge -s ours <分支名称>

他们的合并策略

theirs 策略选择另一个分支的版本,忽略当前分支的更改。当你想保留另一个分支的更改并丢弃当前分支的更改时,这可能会很有用。

git merge -s theirs <分支名称>

合并策略选项

除了内置的合并策略外,Git 还提供了几个选项,可用于微调合并过程:

选项 描述
--no-commit 执行合并但不创建新提交
--no-ff 避免快进合并并创建新的合并提交
--squash 将来自另一个分支的所有提交压缩为一个提交
--abort 中止合并操作并将仓库恢复到先前状态

应用适当的合并策略和选项有助于你保持干净且有条理的提交历史记录,尤其是在处理复杂的 Git 工作流程时。

总结

在本教程中,你已经学会了如何在不使用快进选项的情况下合并 Git 分支。通过理解 Git 分支的基本概念并应用适当的合并策略,你可以有效地管理你的代码库并保持清晰的提交历史记录。这些技能对于协作开发以及确保基于 Git 的项目的长期可维护性至关重要。