转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~
这三个确实非常像,以至于对于初学者来说比较难理解。
先给出对比:
特性 | git merge | git rebase | git cherry-pick |
---|---|---|---|
功能 | 合并分支,保留历史 | 重新应用提交,使历史线性化 | 挑选特定提交,复制到另一个分支 |
提交顺序 | 保留分支的分叉和合并点 | 改变提交顺序,使历史线性化 | 不改变提交顺序,仅复制指定提交 |
哈希值 | 不改变原始提交哈希值 | 改变原始提交哈希值 | 生成新的提交哈希值 |
历史清晰度 | 保留分支历史,适合多人协作 | 线性化历史,适合个人开发 | 灵活挑选提交,但可能使历史复杂 |
适用场景 | 合并分支,保留完整历史 | 更新分支,清理提交历史 | 将特定修复或功能应用到其他分支 |
可视化结果 | Learn Git Branching | Learn Git Branching | Learn Git Branching |
是否创建新提交 | 创建合并提交(merge commit) | 重新应用提交,生成新的提交 | 复制指定提交,生成新的提交 |
是否修改历史 | 不修改历史 | 修改历史,重新应用提交 | 修改历史,复制指定提交 |
冲突处理 | 合并冲突,解决后完成合并 | 逐个解决冲突,继续变基 | 逐个解决冲突,继续挑选提交 |
假设我们有以下的提交历史:
A -- B -- C [main]
\
D -- E [feature]
main
分支包含提交 A、B 和 C。
feature
分支从 main
的 B 提交分叉,包含提交 D 和 E。
git merge
如果我们在 main
分支上运行 git merge feature
,Git 会创建一个新的合并提交,将 feature
分支的更改合并到 main
分支。
可视化结果:
A -- B -- C -- F [main]
\ /
D -- E [feature]
main
和 feature
分支的合并。
git rebase
如果我们在 feature
分支上运行 git rebase main
,Git 会将 feature
分支的提交 D 和 E 重新应用到 main
分支的最新提交 C 上。
可视化结果:
A -- B -- C [main]
\
D' -- E' [feature]
git cherry-pick
假设我们只想将 feature
分支上的提交 E 应用到 main
分支,可以在 main
分支上运行 git cherry-pick E
。
可视化结果:
A -- B -- C -- E' [main]
\
D -- E [feature]
main
分支上,生成了新的提交 E'。
个人理解
因此,我觉得: merge > cherry-pick >> rebase
git merge
示例# 切换到 main 分支
git checkout main
# 合并 feature 分支
git merge feature
git rebase
示例# 切换到 feature 分支
git checkout feature
# 将 feature 分支的提交重新应用到 main 分支
git rebase main
git cherry-pick
示例# 切换到 main 分支
git checkout main
# 挑选 feature 分支上的提交 E
git cherry-pick E