Git 协同开发与冲突解决

目录

前言

一、协同工作基础流程

二、冲突是如何产生的?

三、解决冲突的标准步骤

[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 机制,并掌握手动解决冲突的方法,就能顺畅地与他人协同开发。希望这篇笔记能帮助你建立清晰的工作流,告别"推送被拒绝"。

相关推荐
Titan20249 分钟前
C++位图学习笔记
c++·笔记·学习
乘风遨游天地间16 分钟前
CSTQB笔记-基础级CTFL(更新中)
笔记
不老刘35 分钟前
Git Cherry-Pick:微前端架构下的“精准医疗”与最佳实践
前端·git
Ting.~40 分钟前
软件设计师备考笔记【day3】-数据库
数据库·笔记
Ting.~42 分钟前
软件设计师备考笔记【day3】-操作系统
笔记
handler011 小时前
进程状态流转的本质:Linux 内核队列与底层数据结构解密
linux·运维·c语言·数据结构·c++·笔记·学习
Nice_Fold1 小时前
Kubernetes探针机制与Deployment控制器(自用笔记)
笔记·容器·kubernetes
爬楼的猪1 小时前
Git Folder Dashboard
git
Uncertainty!!1 小时前
claude code中添加skills自动生成git commit信息
git·git commit·claude code
羊群智妍2 小时前
2026免费GEO监测工具技术评测与使用
笔记