冲突是git在保护代码而非同步失败,需人工裁决修改;解决步骤为:git status查文件、编辑删标记、git add暂存、git commit完成。

冲突不是同步失败,而是 Git 在告诉你:“这两处修改我都保留了,但需要你亲自决定最终长什么样”。只要操作顺序对,90% 的冲突都能在 5 分钟内干净解决。
git merge 出现 conflict: failed to merge 时该怎么做
这是最典型的合并冲突提示,说明 git merge 卡在了文件内容分歧上,没生成 commit。此时工作区已处于 MERGING 状态,不能切分支、不能提交其他代码。
- 先用
git status查看哪些文件标为both modified,这些就是冲突文件 - 打开任一冲突文件,你会看到类似这样的标记:
>>>>> feature
中间的 ======= 是分界线:上面是当前分支(HEAD)的内容,下面是待合并分支的内容
- 手动删掉所有
、<code>=======、>>>>>>标记,只保留你想要的逻辑(可以混写,比如保留 main 的结构 + feature 的参数) - 改完后执行
git add <file></file>,把文件从 “未合并” 状态移入暂存区 - 全部冲突文件都
add完后,运行git commit(不用加-m,Git 会自动填默认信息)
想避免 merge 提交污染历史?用 git rebase 替代
git merge 会强制生成一条 merge commit,而 git rebase 把你的提交“挪”到目标分支顶端,历史更线性——这对 CI/CD 和 code review 更友好。
批量替换指定目录下所有 Git 仓库的远程地址(remote URL)。 当用户需要将 Git 仓库从一个服务器迁移到另一个服务器时使用。 触发词:git remote 替换、git url 批量修改、git 仓库迁移、更换 git 地址、批量修改 remote url。
- 假设你在
feature分支开发,想同步main的最新改动:先git fetch origin拉取远程更新,再git rebase origin/main - 如果 rebase 过程中报 conflict,处理方式和 merge 一样:编辑文件 →
git add→git rebase --continue - 注意:rebase 后的提交 SHA-1 全变了,如果
feature已推过远程,后续要git push --force-with-lease origin feature,不能直接push - 别对已共享的公共分支(如
main、dev)做 rebase,只对自己尚未推送或仅限本地的分支用
GitLab 页面点 Merge Request 却提示 “Resolve conflicts”
这是远程分支间同步最常卡住的地方:本地没冲突,但 GitLab 合并时发现远程两个分支的差异无法自动合。
- 点 “Resolve conflicts” 后,GitLab 会打开一个在线编辑器,左侧是目标分支(如
main)内容,右侧是源分支(如dev-jwh)内容,中间是结果区 - 它不会帮你删标记,而是让你逐块点击 “Use this version” 或 “Accept both” —— 实际就是选左边、右边、还是手动敲
- 保存后会自动生成一个临时 commit,你仍需点击 “Commit merge” 才算真正提交
- 关键提醒:
Delete source branch when merge request is accepted默认勾选,务必取消,否则合并完dev-jwh就没了
IDEA 里点 Merge 却没弹出冲突窗口?
不是 IDEA 坏了,大概率是你没真正触发合并动作,或者冲突被静默跳过了。
- 确认右下角分支名是否真在目标分支(比如你想把
feature合进main,必须先Checkout到main) - 右键项目 → Git → Merge Branches → 弹窗里选的是 “merge into current branch”,不是 “merge from current branch”
- 如果 IDEA 显示 “Already up to date”,说明它认为两个分支没有 diverged(即你本地
main可能比远程旧,先git pull origin main再试) - 冲突文件在 Project 视图里会带红色感叹号,双击打开才显示三栏对比;如果只看到普通编辑器界面,说明 IDEA 没识别出冲突,试试命令行
git status验证
真正麻烦的从来不是冲突本身,而是有人在没 fetch 远程最新状态的情况下直接 merge,或者把未 add 的冲突文件当成已解决——这些操作会让冲突残留好几轮,最后得靠 git reset --hard 回滚重来。










