用字符画描述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 方法并不是一个真正的分支合并策略,它只是用于将选定的提交从一个分支复制到另一个分支,因此它不应用于将一个完整的功能分支合并到主分支的场景。