切换·Esc 返回

合并Merge

Git 专区
把独立工作线上的改动带回当前版本

合并常用来把功能分支的成果带回主线。如果两边修改了 Git 无法自动判断的同一处,就会产生冲突,需要理解两边意图、编辑最终内容并重新测试。

feature/new-nav
main
$ git switch main && git merge feature/new-nav
分支的绿点合回主线,拧出一个紫色 merge commit。只有两边改了同一行才会冲突:手选一版、删干净标记、重新 commit。合完点开页面跑一遍才算真的合完。

什么时候用

  • 目标分支没有新提交时,可以直接快进
    main
  • 两边都有新提交时,可以创建合并提交保留分支关系
    main
  • 冲突 = 两边改了同一行:Git 不敢替你选,把两版都摆出来
    <<<<<<< HEAD标题:小狸的主页=======标题:小狸的摄影主页>>>>>>> feature
  • 解完冲突重新 add + commit:删掉标记、留好版本,才算合完
    手选一版git addgit commit

什么时候不用

  • 分支上没跑通就合回 main:坏代码直接污染主线
    分支上还白屏→ merge →main 也白了
    没跑通就合,坏代码污染主线
  • 看到冲突标记两版全删:功能直接没了,先冷静下来读一遍
    标题:小狸的主页
    标题:小狸的摄影主页
    两版全删了,功能直接没了
  • 冲突标记没有清理完整就提交,代码会保留无效内容
    <<<<<<< HEAD
    标题:小狸的主页
    标记没删干净,页面直接报错
  • 合完不点开看一遍就 推送 Push:线上报错,用户先踩雷
    merge ✓push ✓线上报错
组成结构 · Anatomy
<<<<<<< HEAD <h1>小狸的主页</h1> ======= <h1>小狸的摄影主页</h1> >>>>>>> feature/new-nav
1冲突开始标记<<<<<<< HEAD从这里开始是冲突区,HEAD 指你当前所在分支的版本
2你这边的版本Current Change当前分支上这行长什么样,通常是 main 主线的内容
3分隔线=======上下两个版本的分界,解冲突时要一起删掉
4对方分支的版本Incoming Change被合进来的那条分支上这行长什么样
5冲突结束标记>>>>>>> branch冲突区到此为止,标着内容来自哪条分支
常见变体 · 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