理解合并类型

Git 高级

Amanda Crawford-Adamo

Software and Data Engineer

我是 Amanda

Amanda 的照片

Git 高级

什么是 git merge?

Git 合并命令:

git merge
  • 将一个分支的更改合入另一个分支
  • 查找两个分支的共同基点
  • 可使用不同的合并策略

两条道路汇合,两辆车并入同一路

Git 高级

快进合并

什么是快进合并?

  • 保持简单、直线的历史
  • 适合短期分支与简单变更

$$

不建议使用

  • 需要保留分支历史
  • 长期分支的复杂功能开发
  • 分支间有合并冲突——快进会立即失败!
Git 高级

快进合并(前)

一张图显示两个分支:main 和 feature。main 有两个提交。feature 在 main 最新提交后分叉,并在其分支上多一个提交。

Git 高级

快进合并语法

Git 快进合并(默认)

git checkout main
git merge feature_branch

强制快进合并

git merge <branch> --ff-only

示例

git checkout main
git merge feature_branch --ff-only
Git 高级

快进合并(后)

一张图显示两个分支:main 和 feature。main 有三个提交。feature 在 main 的第二次提交后分叉,并多一个提交。main 的第三次提交是 feature 最新提交的副本。

Git 高级

递归合并

什么是递归合并?

  • 创建一个具有两个父提交的合并提交
  • 保留完整的项目历史
  • 适合长期存在的分支
  • 维护分支结构

$$

不建议使用的情况

  • 需要保持简单、线性的历史
  • 快速且小的变更
Git 高级

递归合并(前)

一张图显示两个分支:main 和 feature。main 有三个提交。feature 在 main 的第一次提交后分叉,并在其分支上多两个提交。

Git 高级

递归合并语法

递归合并命令:

git merge --no-ff <branch>

示例

$ git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.

$ git merge --no-ff feature_branch
Merge made by the 'recursive' strategy.
...
Git 高级

递归合并(后)

一张图显示两个分支:main 和 feature。main 有六个提交。feature 在 main 最新提交后分叉,并在其分支上多两个提交。main 的六个提交交错包含了 main 和 feature 的提交。main 的最新提交是一个具有两个父提交的合并提交对象:feature 的最新提交和 main 之前的最新提交。

Git 高级

总结

  • 快进合并保持历史简单、线性
  • 递归合并保留历史上下文
  • 复杂开发更适合使用递归合并

快进合并命令

git merge <branch_name> # 默认命令
git merge --ff-only <branch_name> # 强制快进合并

递归合并命令

git merge --no-ff <branch_name>
Git 高级

让我们来练习!

Git 高级

Preparing Video For Download...