用字符画描述git的合并方法
1. 合并(Merge)
main 分支 A---B---C
\
dev 分支 D---E---F
在 main 分支上执行 `git merge dev` 后:
main 分支 A---B---C-----------G <- (G 是合并提交)
\ /
dev 分支 D---E---F
2. 变基(Rebase)
main 分支 A---B---C
\
dev 分支 D---E---F
在 dev 分支上执行 `git rebase main` 后,再在 main 分支上执行 `git merge dev`:
main 分支 A---B---C---D'---E'---F'
3. 压缩合并(Squash and Merge)
main 分支 A---B---C
\
dev 分支 D---E---F
在 main 分支上执行 `git merge --squash dev` 后,再执行提交:
main 分支 A---B---C-----------G' <- (G' 是一个新的提交,合并来自 D、E 和 F 的变更)
4. 拣选提交(Cherry-pick)(不是标准合并所有更改的方法)
main 分支 A---B---C
\
dev 分支 D---E---F
在 main 分支上对 dev 分支的每个提交执行 `git cherry-pick <提交哈希值>`:
main 分支 A---B---C---D'---E'---F' <- (每个提交被逐一复制)
合并方法的对比表格
方法 | 特点 | 适用场景 | 结果 |
---|---|---|---|
Merge | 保留所有分支的历史 | 标准的合并操作,适用于大多数场景 | 创建一个新的合并提交 |
Rebase | 使历史线性化 | 个人分支上的工作或清洁历史 | 不保留原始分支提交的顺序 |
Squash and Merge | 将所有更改压缩为一个提交 | 当你想要简化复杂分支的历史时 | 一个新的单一提交 |
Cherry-pick | 手动选择特定提交 | 只合并某些特定的更改 | 对选择的每个提交创建新的提交 |
请注意,这些方法中,Merge 和 Rebase 是最常用的策略来整合一个开发分支(如 dev)到主分支(如 main)。Squash and Merge 通常用于在合并之前压缩多个提交以保持清洁的历史。Cherry-pick 方法并不是一个真正的分支合并策略,它只是用于将选定的提交从一个分支复制到另一个分支,因此它不应用于将一个完整的功能分支合并到主分支的场景。