Git

合并Merge

你可能会说

我在另一边试的功能成了,怎么把它并回正式版本?

合并是把另一条修改路线上的已保存改动放进当前路线的操作。例如功能完成后,可以把功能路线合回主版本。两边都改到同一处时,Git 会提示内容冲突,需要决定保留什么、清理提示标记并重新检查。
主版本
新功能
✓主版本已更新两边的改动放到了一起
git merge feature/new-nav

Merge 把另一条分支已经完成的改动带进当前分支。若两边改了同一处,Git 会暂停并请你决定最后保留什么。

组成结构 · Anatomy
<<<<<<< HEAD <h1>小狸的主页</h1> ======= <h1>小狸的摄影主页</h1> >>>>>>> feature/new-nav
从这里开始是冲突区,HEAD 指你当前所在分支的版本
当前分支上这行长什么样,通常是 main 主线的内容
上下两个版本的分界,解冲突时要一起删掉
被合进来的那条分支上这行长什么样
冲突区到此为止,标着内容来自哪条分支
常见变体 · Variants
快进合并Fast-forward
Updating a3f9c21..e7b2d48
目标分支没有独立的新提交
合并提交Merge Commit
Merge made by the 'ort' strategy.
两侧均有新提交,需要保留合并节点
中止合并merge --abort
git merge --abort
需要放弃当前尚未完成的合并时
典型使用场景
终端 git merge 合回主线
zsh — my-first-page
$ git switch main Switched to branch 'main' $ git merge feature/new-nav Merge made by the 'ort' strategy. index.html | 24 ++++++++++++++----- 1 file changed, 16 insertions(+), 8 deletions(-)
冲突文件里的标记
📄 index.html⚠ 1 处冲突
<<<<<<< HEAD(主线)
<h1>小狸的主页</h1>
=======
<h1>小狸的摄影主页</h1>
>>>>>>> feature/new-nav(分支)
编辑为最终内容,移除全部冲突标记后重新提交
VS Code 冲突解决按钮
📄 index.html 合并冲突
采用当前更改采用传入的更改保留双方更改
<h1>小狸的主页</h1>(当前 · HEAD)
<h1>小狸的摄影主页</h1>(传入 · 分支)
可选择保留当前更改、传入更改或双方更改
GitHub PR 合并按钮
新导航栏 #2
oil-oil 想把 feature/new-nav 合并到 main
✓ 此分支与基础分支没有冲突
Merge pull request
网页上点这个绿按钮,效果等同于 git merge
快速判断

Git Merge 和 Rebase 有什么区别?

已共享的提交通常用 Merge 整合;尚未共享的个人分支可以在代码评审前用 Rebase 整理成线性历史。

对比维度Git MergeGit Rebase
提交历史保留完整的分支分叉与汇合记录(快进合并时仅移动分支指针)将当前分支的提交在目标基线上逐个重放,生成全新哈希的线性历史
协作安全不改写已有提交 ID,更适合整合多人已经拉取的历史会生成新的提交 ID;改写共享历史前必须与协作者明确协调
适用时机合并功能分支到主干,或同步已经共享的团队分支个人分支尚未共享,想在评审前整理历史或同步主干改动
延伸阅读 · 权威出处