目录
[3.1 先拉取远程更新](#3.1 先拉取远程更新)
[3.2 手动解决冲突](#3.2 手动解决冲突)
[3.3 标记已解决并提交](#3.3 标记已解决并提交)
[四、实战演示(命令行 + IDEA)](#四、实战演示(命令行 + IDEA))
[4.1 命令行操作记录(模拟 A 与 B 的冲突)](#4.1 命令行操作记录(模拟 A 与 B 的冲突))
[4.2 IDEA 中的图形化操作](#4.2 IDEA 中的图形化操作)
前言
多人协作时,Git 如何帮我们同步代码?遇到冲突又该怎么处理?本文将结合命令行与 IDEA 操作,带你理清从拉取、提交到解决冲突的全流程。
一、协同工作基础流程
当多人共用同一个远程仓库时(比如团队里的 A、B、C 各自负责不同模块),每个人都需要将自己的代码推送到远程,同时也要把别人已推送的更新同步到本地。这个"同步"动作通常通过两种命令完成:
bash
git fetch 远程仓库名 # 仅抓取远端变更,不自动合并
git pull 远程仓库名 # 抓取 + 自动合并(等同于 fetch + merge)
推荐做法: 在开始编写新代码前,先执行 git pull(或 fetch 后手动 merge),确保本地包含远程所有最新提交。然后再写代码、提交、推送。
如果别人修改的是不同文件,
pull后会自动合并成功,无需额外操作。
二、冲突是如何产生的?
假设有 两个本地仓库 (模拟两位开发者),都基于同一个远程仓库的 master 分支工作。
-
开发者 A:修改
hello.txt并推送成功。 -
开发者 B:在 没有拉取 A 的更新 的情况下,也修改了
hello.txt的同一位置,然后尝试推送。
此时 B 会看到类似这样的错误:
bash
! [rejected] master -> master (fetch first)
error: failed to push some refs to ...
hint: Updates were rejected because the remote contains work that you do not have locally.
原因很简单:远程仓库的提交历史已经比 B 本地"领先"了,且修改了同一个文件的同一区域。Git 无法自动决定保留谁的版本,于是拒绝推送,要求先解决冲突。
三、解决冲突的标准步骤
3.1 先拉取远程更新
bash
git pull origin master
如果修改了不同文件,通常会自动合并成功。但如果修改了同一个文件的同一位置,pull 会提示:
bash
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
3.2 手动解决冲突
进入冲突文件(如 hello.txt),你会看到 Git 标记的冲突区域:
bash
<<<<<<< HEAD
当前分支的修改内容
=======
远程分支的修改内容
>>>>>>> origin/master
你需要 手动编辑,删除标记符号,保留最终想要的内容。例如保留两行合并后的结果。
3.3 标记已解决并提交
bash
git add hello.txt
git commit -m "合并冲突:保留双方修改"
git push origin master
四、实战演示(命令行 + IDEA)
4.1 命令行操作记录(模拟 A 与 B 的冲突)
1. 初始状态(远程已有基础提交)
bash
$ git log --all --oneline --graph
* f6cd762 (HEAD -> master, origin/master) Add new file
* d18649c Modify first
* 74c74a8 Initial commit
2. 开发者 A 提交并推送
bash
$ git commit -a -m 'Modify by A'
[master 12ab3ab] Modify by A
$ git push origin
# 成功推送
3. 开发者 B 未拉取,直接修改同一文件并推送 → 被拒绝
bash
$ git commit -a -m 'Modify by B'
[master 8608aa5] Modify by B
$ git push origin
! [rejected] master -> master (fetch first)
4. B 执行 git pull,产生冲突
bash
$ git pull origin
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
5. B 手动解决冲突后提交并推送
bash
# 编辑 hello.txt 解决冲突
$ git commit -a -m 'Modify by B finally'
$ git push origin
6. 最终提交历史(包含合并节点)
bash
$ git log --all --graph --oneline
* f19138b (HEAD -> master, origin/master) Modify by B finally
|\
| * 36504b6 Modify by A
| * dfce350 Merge remote-tracking branch 'origin/master' Merge commit by A
| |\
| * | 12ab3ab Modify by A
* | | 8608aa5 Modify by B
| |/
|/|
* | 4d3cd38 Modify by B
|/
...
4.2 IDEA 中的图形化操作
添加用户

推送图标

定义远程

可修改分支名称,表明IDEA的master分支是提交到远程仓库的main分支上


在远程仓库中手动修改pom.xml文件内容:
在远程仓库中有5次提交

但在本地还是4次提交

点击这个拉取进行更新:

成功显示

可以直接在IDEA首页来实现从远程仓库中克隆仓库至本地


小结
多人协作时,冲突并不可怕。只要理解 Git 的 fetch / pull / merge 机制,并掌握手动解决冲突的方法,就能顺畅地与他人协同开发。希望这篇笔记能帮助你建立清晰的工作流,告别"推送被拒绝"。