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

相关推荐
高志小鹏鹏3 小时前
告别“修复 bug”:让别人一眼看懂你的 Commit
git·github·代码规范
南境十里·墨染春水4 小时前
Linux学习进展 进程管理命令 及文件压缩解压
linux·运维·笔记·学习
航Hang*4 小时前
第2章:进阶Linux系统——第4节:配置与管理NFS服务器
linux·运维·服务器·笔记·学习·vmware
ZhiqianXia4 小时前
Pytorch 学习笔记(8): PyTorch FX
pytorch·笔记·学习
xuhaoyu_cpp_java5 小时前
Boyer-Moore 投票算法
java·经验分享·笔记·学习·算法
雨浓YN5 小时前
OPC UA 通讯开发笔记 - 基于Opc.Ua.Client
笔记·c#
迷路爸爸1805 小时前
Docker 入门学习笔记 06:用一个可复现的 Python 项目真正理解 Dockerfile
笔记·学习·docker
Engineer邓祥浩5 小时前
JVM学习笔记(6) 第二部分 自动内存管理 第5章节 调优案例分析与实战
jvm·笔记·学习
ysa0510305 小时前
斐波那契上斐波那契【矩阵快速幂】
数据结构·c++·笔记·算法