0、快速上手
公司开发流程

最好在git merge前再pull一下
你刚加入实习公司的 Gitee 仓库,本质上就是公司在 Gitee 平台上搭建的远程 Git 仓库,是团队存放项目代码、进行协作开发的核心载体,和我们之前聊的 “远程仓库” 是同一个概念,只是它归公司所有、用于实际的业务开发。
先搞懂:公司的 Gitee 仓库到底是什么?
可以把它理解为:
- 团队的 “云端代码共享盘”:所有团队成员的代码最终都会同步到这个仓库,它是项目代码的 “权威版本”;
- 带版本管理的 “代码数据库”:不仅存代码,还通过 Git 记录了每一次代码修改(谁改的、改了什么、什么时候改的),能追溯历史、回滚错误修改;
- 协作的 “核心枢纽”:你作为实习生,需要从这里拉取最新代码、把自己写的代码推上去,还能通过仓库的功能(如 PR/MR、Issues)和同事沟通开发问题。
公司 Gitee 仓库的核心特点(和个人仓库的区别)
| 维度 | 公司 Gitee 仓库 | 个人 Gitee 仓库 |
|---|---|---|
| 归属 / 权限 | 归公司 / 团队所有,有严格的权限控制(比如你可能只有 “读取 + 提交” 权限,管理员有 “删除 / 设置” 权限) | 归个人所有,你拥有全部权限 |
| 用途 | 存放公司业务项目代码,用于团队协作开发、上线部署 | 存放个人学习 / 练习代码,或个人项目 |
| 规范要求 | 有严格的提交规范、分支规范(比如主分支保护,不能直接推代码)、代码审核流程 | 无强制规范,自己怎么方便怎么来 |
| 数据安全 | 重要业务代码,通常要求定期备份,禁止泄露 | 个人代码,安全性要求低 |
这是你接下来最常用的操作,记好这几步:核心操作是 “克隆→拉取→开发提交→推送”
-
克隆仓库到本地(首次操作):先从 Gitee 仓库页面复制仓库地址(HTTPS 或 SSH 地址),然后在本地执行:
git clone 仓库地址 # 例:git clone https://gitee.com/公司组织名/项目名.git执行后,本地会生成和远程仓库一致的代码文件夹,这就是你的 “本地开发副本”。
-
拉取最新代码(每天开发前必做):因为其他同事可能已经提交了新代码,你需要先同步到本地,避免冲突:
git pull注意:绝对不要在本地有未提交修改时直接执行
git pull,正确做法是先 “暂存” 或 “提交” 本地修改,再拉取远程代码,最后处理可能的冲突。 -
本地开发并提交:写代码后,把修改提交到本地仓库(这一步只改本地,别人看不到):
git add . # 把所有修改的文件加入暂存 git commit -m "【修复】用户登录按钮样式问题" # 按公司规范写提交说明 -
推送代码到远程仓库(完成开发后):把本地的提交推到公司 Gitee 仓库,让团队看到你的修改:
git push
一、查看 Git 版本
git -v
# 或者更规范的写法(效果完全一致)
git --version
二、修改配置(比如改用户名 / 邮箱、改默认分支名)
# 修改全局用户名(--global 表示全局生效,不加则仅当前仓库生效)
git config --global user.name "新用户名"
# 修改全局邮箱
git config --global user.email "新邮箱@xxx.com"
# 修改默认分支名为 main(现在更推荐用 main 而非 master)
git config --global init.defaultbranch main
若想查看某一项具体配置,可执行:
git config user.name # 仅查看用户名
git config user.email # 仅查看邮箱
要检查已有的配置信息,可以使用 git config --list 命令

三、创建新仓库:初始化
在你指定的文件夹里创建一个新的 Git 仓库,让 Git 开始追踪这个文件夹里的所有文件变化,是使用 Git 管理项目的第一步。
核心作用:将普通文件夹转换为 Git 仓库,生成 .git 目录来存储版本控制的所有数据;
git init 仓库名
你可以把这个过程想象成:
- 你有一个空的文件夹(比如存放你的代码、文档),原本它只是一个普通文件夹,没有任何版本管理能力;
- 执行
git init后,Git 会在这个文件夹里悄悄创建一个名为.git的隐藏文件夹(这是 Git 的核心目录); - 这个
.git文件夹就像一个 “账本”,专门记录你后续对文件夹里文件的所有修改(比如新增、删除、修改内容),从此这个文件夹就变成了 “Git 仓库”,可以用 Git 进行版本控制了。
git init 的使用方法:
# 第一步:先进入你想作为仓库的文件夹(比如你的项目文件夹)
cd C:\Users\PC\Desktop\我的项目
# 第二步:执行初始化命令
git init
执行成功后,终端会提示:Initialized empty Git repository in C:/Users/PC/Desktop/我的项目/.git/,说明仓库创建成功。
初始化后的基本操作
1、初始化仓库后,还需要把文件 “交给” Git 管理,举个简单例子:
# 1. 在项目文件夹里新建一个文件(比如 readme.txt)后,先告诉 Git 要追踪这个文件
git add readme.txt
# 2. 把文件的当前状态“保存”到 Git 账本里(这就是一次提交)
git commit -m "第一次提交:添加readme文件"
2、本地仓库和远程 Gitee 仓库建立连接
# 语法:git remote add 远程别名 远程仓库地址
# 推荐用默认别名 origin(所有 Git 项目通用,避免拼写错误)
git remote add origin https://gitee.com/..../.git
验证远程仓库是否添加成功
git remote -v
虽然你已经添加了远程仓库 origin,但本地 master 分支还没和远程 origin/master 分支建立 “上游关联”(Git 不知道该把本地 master 推送到远程 origin 的哪个分支)。
你只需要执行这行命令:(前提是已经add和commit了)
git push --set-upstream origin master
# 简写形式(效果完全一样,更常用):
git push -u origin master
三、克隆(clone):克隆远程仓库到本地(首次)
如果你想从远程服务器克隆下来一个仓库,那你需要使用到git clone命令,比如如果我想克隆Gitee上的一个开源框架Sa-Token的仓库 其url为 https://gitee.com/dromara/sa-token.git。那么我们可以这样使用
git clone https://gitee.com/dromara/sa-token.git
四、本地开发、提交
git add . → git commit -m "修改说明"
第一步:git add .
- 命令含义:
add是 “添加” 的意思,.代表当前目录下所有有修改的文件(包括新增、修改、删除的文件); - 核心作用:把工作区中所有修改的文件,提交到暂存区(标记为 “准备提交”);
- 新手注意:
- 只写
git add会报错,必须指定要添加的文件(.是快捷方式); - 如果只想提交单个文件(比如只改了
login.js),可以精准指定:git add src/login.js # 只添加这个文件到暂存区,更规范 - 执行后没有任何输出,说明操作成功(Git 的 “静默成功” 原则)。
- 只写
第二步:git commit -m "修改说明"
- 命令含义:
commit是 “提交” 的意思,-m是message的缩写(指定提交信息),引号里的内容是对这次修改的说明; - 核心作用:把暂存区里的所有修改,正式保存到本地仓库,生成一个唯一的版本记录(有专属的哈希值,比如
a8f579c); - 新手注意:
- 必须写
-m和提交信息,否则会弹出编辑器(新手容易操作失误); - 提交信息要清晰、规范(公司会有要求),比如:
✅ 正确:git commit -m "【修复】登录模块:解决验证码过期不提示的问题"
❌ 错误:git commit -m "改了点东西"(别人看不懂,后续自己也忘); - 执行成功后,终端会输出类似内容(表示提交成功):
解释:[feature/login 8a7b6c9] 【修复】登录模块:解决验证码过期不提示的问题 1 file changed, 3 insertions(+), 1 deletion(-)8a7b6c9是这次提交的版本号,1 file changed表示改了 1 个文件,新增 3 行、删除 1 行。
- 必须写
五、git push:推送本地提交到远程的同步命令
它的本质是:将本地仓库中已提交的版本记录,上传到远程仓库对应的分支上,让团队成员能看到你的修改,也能让你的代码有云端备份。
举个新手友好的使用例子(假设你已经关联了远程仓库):
# 推送本地 master 分支到远程仓库的 origin 主机(origin 是远程仓库的默认别名)
git push origin master
# 如果你想推送当前分支,且本地分支和远程分支名称一致,可简化为
git push
拉取最新代码(每天开发前必做):

六、git pull:拉取最新代码(每天开发前必做)
因为其他同事可能已经提交了新代码,你需要先同步到本地,避免冲突
git pull <远程主机名> <远程分支名>:<本地分支名>
git pull 不是单一操作,而是两个命令的 “组合拳”:
git pull = git fetch + git merge
git fetch:仅从远程仓库下载最新的代码版本信息(不会修改你本地的工作代码);git merge:把下载的远程最新代码,合并到你当前的本地分支。
用通俗的话讲:git fetch 是 “看看远程有什么新代码”,git merge 是 “把新代码合并到我本地”,git pull 直接把这两步做完。
一、git pull 的基础用法(新手必掌握)
1. 最基础用法(拉取当前分支的远程最新代码)
# 先进入你的项目目录(比如公司项目在桌面)
cd C:\Users\PC\Desktop\公司项目
# 拉取远程最新代码
git pull
执行成功后,终端会输出类似内容:
Already up to date. # 表示本地已经是最新,无需合并
# 或
Updating 8a7b6c9..f3d2e14 # 表示拉取并合并了新代码,版本从8a7b6c9更新到f3d2e14
Fast-forward
src/login.js | 3 +++
1 file changed, 3 insertions(+)
2. 精准指定远程和分支(进阶,避免拉错)
如果本地有多个远程仓库 / 分支,可明确指定:
# 拉取 origin 远程仓库的 main 分支到本地当前分支
git pull origin main
origin:Git 给远程仓库的默认别名(克隆仓库时自动创建);main:远程仓库的主分支(也可能是 master,看公司仓库配置)。
二、新手必避的坑(核心注意事项)
1. ❌ 绝对不要在本地有未提交修改时直接 git pull
这是最容易出问题的场景!如果本地有没提交的代码,直接拉取可能导致:
- 代码冲突混乱;
- 本地修改被覆盖(前面对话中重点提过)。
✅ 正确做法(保留本地修改):
# 1. 暂存本地修改
git stash
# 2. 拉取远程最新代码
git pull
# 3. 恢复本地修改(有冲突则手动解决)
git stash pop
2. ✅ 拉取前先确认当前分支
避免拉错分支导致代码混乱,先执行:
git branch # 查看当前分支(带*号的是当前分支)
示例输出(* 号表示当前在 feature/login 分支,无 * 号:只是本地存在的分支,当前未使用。):
main
* feature/login
3. 🚨 遇到合并冲突怎么办?
如果你的本地修改和远程代码冲突(比如都改了 login.js 的同一行),git pull后会提示:
Auto-merging src/login.js
CONFLICT (content): Merge conflict in src/login.js
Automatic merge failed; fix conflicts and then commit the result.
解决步骤:
- 打开冲突文件(如
src/login.js),会看到 Git 标记的冲突区域:<<<<<<< HEAD // 你本地的代码 const verifyCode = "本地验证码逻辑"; ======= // 远程拉取的代码(同事改的) const verifyCode = "远程最新验证码逻辑"; >>>>>>> f3d2e14 // 远程版本号 - 手动修改冲突内容(和同事确认保留哪版,或合并);
- 保存文件后,执行以下命令标记冲突已解决:
git add src/login.js # 标记冲突文件已处理 git commit -m "【合并】拉取远程代码:解决登录验证码逻辑冲突"
六、git分支 ( branch )
先通俗理解:分支是什么?

可以把 Git 分支想象成 “代码的平行宇宙”:
- 主分支(main)是 “主线宇宙”:存放经过测试、可以上线的稳定代码,是团队代码的 “最终版本”;
- 功能分支(feature/login)是 “支线宇宙”:你在这个分支里开发登录功能,修改代码不会影响主线宇宙的稳定代码,开发完成后再把支线合并回主线。


git branch 是git命令中的一个分支管理命令,用于列出、创建、重命名、删除等分支操作,它的主要用法,我进行了一个罗列:
| 命令 | 作用 | 实战场景 |
|---|---|---|
git branch | 查看本地所有分支(当前分支前标 *) | 确认自己在哪个分支、项目有哪些分支 |
git branch -r | 查看远程所有分支 | 同步远程分支信息,确认团队新增的分支 |
git branch -a | 查看本地 + 远程所有分支 | 全面了解分支全貌 |
git branch <分支名> | 创建本地分支(不会切换) | 基于主分支创建开发 / 修复分支 |
git checkout -b <分支名> | 创建并切换到新分支(常用) | 新建分支后直接开始开发 |
git branch -d <分支名> | 删除本地已合并的分支 | 功能开发完成后清理无用分支 |
git branch -D <分支名> | 强制删除本地未合并的分支 | 废弃某个未完成的功能分支 |
git branch -m <旧名> <新名> | 重命名本地分支 | 分支名写错 / 规范调整时使用 |
git push origin <分支名> | 将本地分支推到远程 | 让团队成员看到你的开发分支 |
git push origin --delete <分支名> | 删除远程分支 | 功能上线后清理远程无用分支 |
常用:创建新分支(基于当前分支)
“基于当前分支创建新分支” 是 Git 分支操作里的核心概念,简单来说:新创建的分支会完全复制你 “当前所在分支” 的所有代码、提交记录、文件状态 —— 相当于给当前分支的代码拍了一张 “快照”,新分支就是从这张快照开始的。
用通俗的例子理解:
假设你现在在 main 分支(当前分支),这个分支里有:
- 登录页面
login.html(已完成) - 首页
index.html(已完成) - 没有支付相关文件
此时执行 git branch feature/pay 创建新分支:
- 新分支
feature/pay会100% 复制main分支的所有内容(login.html、index.html 都在,且内容和 main 完全一致); - 你切换到
feature/pay后,新增pay.html、修改代码,这些操作只会影响 feature/pay 分支,不会动 main 分支的代码; - 而如果有人修改了 main 分支的 login.html,你的 feature/pay 分支里的 login.html 还是原来的版本(除非你主动合并 main 的修改)。
git branch feature/pay作用:创建名为feature/pay的新分支,新分支会完全复制当前分支的所有代码;
新手注意:git branch创建后不会自动切换到新分支,仍停留在原分支;- 推荐先切换到
main分支、拉取最新代码,再创建功能分支(保证新分支基于最新稳定代码):git checkout main # 切换到main git pull # 拉取最新 git branch feature/login # 创建登录分支
七. 检出(checkout)
git checkout 命令,它是 Git 中切换分支、恢复文件的核心命令,简单来说,git checkout 主要有两大核心用途:
一是切换到已存在的分支(比如从 main 切到 feature/login),二是恢复工作区的文件到指定版本(比如撤销本地未提交的修改)。
一、git checkout 的核心用法(新手必掌握)
用法 1:切换已存在的分支(最常用)
这是你作为实习生每天都会用到的场景,用来在不同分支间切换工作环境。
# 语法:git checkout 分支名
git checkout main # 切换到 main 主分支
git checkout feature/login # 切换到登录功能分支
- 执行成功提示:
Switched to branch 'main'(表示已切换到 main 分支); - 新手注意:
- 切换分支前,确保当前分支的修改已提交 / 暂存(否则 Git 会提示 “本地有未提交修改,无法切换”);
- 可以用
git branch查看所有本地分支,确认要切换的分支名是否正确(避免输错)。
用法 2:创建并切换新分支(新手首选,合并操作)
这是之前提到的 git checkout -b,是 “创建分支 + 切换分支” 的快捷命令,也是最推荐的创建分支方式。
# 语法:git checkout -b 新分支名
git checkout -b feature/pay # 等同于:git branch feature/pay + git checkout feature/pay
- 执行成功提示:
Switched to a new branch 'feature/pay'(表示已创建并切换到新分支); - 核心逻辑:基于当前分支创建新分支,并立即切换到新分支(比如当前在 main 分支,新分支就基于 main 最新代码)。
用法 3:恢复工作区文件(撤销本地未提交的修改)
当你本地改乱了文件,想放弃修改、恢复到最近一次提交的版本时用这个用法。
# 语法1:恢复单个文件
git checkout -- src/login.js # 恢复 login.js 到最近一次提交的状态,放弃所有本地修改
# 语法2:恢复当前目录下所有文件(谨慎!)
git checkout .
- ⚠️ 重要提醒:这个操作会永久删除文件的本地未提交修改,执行前一定要确认这些修改确实没用了;
- 适用场景:比如不小心改乱了代码,想回到干净的状态,或本地修改和远程冲突想直接放弃。
用法 4:切换到远程分支(拉取同事的分支到本地)
如果同事创建了 feature/order 远程分支,你想在本地开发这个分支的功能,需要先切换到远程分支:
# 语法:git checkout -b 本地分支名 origin/远程分支名
git checkout -b feature/order origin/feature/order
- 作用:把远程仓库的
feature/order分支拉到本地,创建同名本地分支并切换过去; - 前提:先执行
git fetch拉取远程分支信息(否则 Git 找不到远程分支)。
二、新手常见问题 & 解决方案
问题 1:切换分支提示 “本地有未提交修改”
error: Your local changes to the following files would be overwritten by checkout:
src/login.js
Please commit your changes or stash them before you switch branches.
- 原因:当前分支有未提交的修改,切换分支会覆盖这些修改,Git 做了保护;
- 解决:
git stash # 暂存修改(想保留的话) # 或 git checkout . # 放弃修改(确认没用的话) git checkout main # 再切换分支
问题 2:恢复文件后发现改错了,想找回修改
- 情况 1:修改仅在工作区(未执行
git add):恢复后无法直接找回(Git 未追踪),只能靠编辑器的历史记录(比如 VS Code 的 “撤销”); - 情况 2:修改已暂存(执行过
git add):可以用git reset HEAD 文件名把暂存的修改放回工作区,再恢复。
问题 3:切换分支后代码没变化?
- 原因:两个分支的代码当前版本一致(比如刚创建的 feature/login 分支和 main 分支);
- 验证:执行
git log查看提交记录,确认两个分支的最新提交是同一个版本。
八、git merge
git merge 的作用是把一个分支的代码修改合并到当前分支中 —— 比如你在 feature/login 分支开发完登录功能后,用 git merge feature/login 就能把登录功能合并到 main 主分支,让主分支包含你的新功能。
一、git merge 的核心逻辑(新手先懂这个)
合并的本质是:Git 对比两个分支的代码差异,把目标分支的修改 “整合” 到当前分支,过程分两种情况,用通俗的例子讲清楚:
假设你有两个分支:
main(主分支,当前分支):包含首页、商品列表代码;feature/login(目标分支):基于main创建,新增了登录页面代码。
情况 1:快速合并(最理想)
如果 main 分支在你创建 feature/login 后没有任何修改,执行:
git checkout main # 切换到主分支(当前分支)
git merge feature/login # 合并登录分支到主分支
Git 会直接把 main 分支的 “指针” 移到 feature/login 的最新版本,没有任何冲突,这就是你之前 git pull 时看到的 Fast-forward,是最简单的合并方式。
情况 2:三方合并(需要处理冲突)
如果 main 分支在你开发 login 分支时,同事改了首页代码,此时合并会触发 “三方合并”:
- Git 会找两个分支的 “共同祖先”(创建
login分支时的版本); - 对比
main和祖先的差异、login和祖先的差异; - 自动合并无冲突的部分,有冲突的部分会标记出来,让你手动解决。
git merge 的基础用法
合并指定分支到当前分支(核心用法)
# 步骤1:切换到要接收合并的分支(比如 main 主分支)
git checkout main
# 步骤2:确保当前分支是最新的(先拉取远程代码)
git pull
# 步骤3:合并目标分支(比如 feature/login)到当前分支
git merge feature/login
二、新手必避的合并坑
1. ❌ 直接在 main 分支合并未测试的功能分支
- 问题:可能把有 bug 的代码合并到主分支,导致主分支代码不稳定;
- 解决:先在功能分支自测通过,再提 MR/PR(Gitee 上的合并请求),经审核后再合并。
2. ❌ 合并前不拉取最新代码
- 问题:合并的是旧版本的主分支,导致后续拉取又出现冲突;
- 解决:合并前务必执行
git checkout main→git pull,保证主分支是最新的。
3. ❌ 合并冲突后直接放弃(用 git merge --abort 需谨慎)
- 如果合并中遇到冲突,想放弃合并,可执行:
git merge --abort # 撤销合并,回到合并前的状态 - 注意:只有还没执行
git commit时,--abort才有效;如果已经 commit 了,需要用git reset回滚。
九、常见冲突
1、版本低

2
如果远程仓库的初始代码为a,现在有一个程序员1把a拉取到自己的本地仓库,有一个程序员2把a拉取到自己的本地仓库,1修改a为b,并提交到远程仓库,2修改a为c,再拉取远程仓库,会发生什么
先梳理整个时间线(便于理解)
| 阶段 | 远程仓库 | 程序员 1 本地 | 程序员 2 本地 |
|---|---|---|---|
| 初始 | a(版本 1) | a(版本 1) | a(版本 1) |
| 步骤 1 | - | 修改为 b → 提交 → 推送到远程 | - |
| 步骤 2 | b(版本 2) | - | 修改为 c(基于版本 1) |
| 步骤 3 | - | - | 执行 git pull(关键操作) |
程序员 2 执行 git pull 后会发生什么?
git pull 本质是 git fetch(拉取远程最新代码) + git merge(合并到本地分支),所以核心是合并阶段出现「合并冲突」,具体现象分两种情况:
情况 1:1 和 2 修改了「同一个文件的同一部分」(核心冲突场景)
这是最常见的情况,Git 无法自动合并,会触发「手动解决冲突」流程,具体表现:
- 拉取过程中断:终端 / IDE 会提示
Automatic merge failed; fix conflicts and then commit the result(自动合并失败,需修复冲突后提交); - 文件被标记为冲突状态:执行
git status会看到文件显示为both modified(双方都修改了); - 冲突文件被标记特殊符号:打开冲突文件,会看到 Git 插入的冲突标记,格式如下:
plaintext
<<<<<<< HEAD # 程序员2本地修改的内容(c) 这是程序员2修改的代码(c) ======= # 分隔符:上是本地,下是远程 这是程序员1修改的代码(b) >>>>>>> [远程提交ID] # 远程仓库的最新代码(b) - 本地分支处于「合并中」状态:
git branch会看到当前分支后标注(MERGING),此时无法直接推送代码,必须先解决冲突。
情况 2:1 和 2 修改了「不同文件」或「同一文件的不同部分」(无冲突)
Git 能自动完成「快进合并」,具体表现:
- 拉取过程自动完成:终端提示
Merge made by the 'recursive' strategy(合并成功); - 本地代码自动整合:程序员 2 的本地代码会同时包含 1 的修改(b)和自己的修改(c),形成新的版本(比如 d);
- 自动生成合并提交:Git 会自动创建一个「合并提交」,记录这次拉取合并的操作,此时程序员 2 可直接执行
git push推送整合后的代码到远程。
程序员 2 的正确解决流程(针对情况 1 的冲突场景)
如果出现手动冲突,必须按以下步骤解决,缺一不可:
步骤 1:定位并修复冲突文件
- 打开标记为
both modified的文件,找到<<<<<<</=======/>>>>>>>标记; - 手动删除冲突标记,保留「正确的代码」(比如保留 1 的修改、保留 2 的修改、或整合双方修改);
- 保存文件(核心:必须删除所有冲突标记,否则 Git 仍判定为冲突)。
步骤 2:标记冲突已解决并提交
# 1. 将修复后的文件添加到暂存区
git add 冲突的文件名 # 比如 git add src/main.java
# 2. 提交合并结果(Git会自动填充合并提交信息,直接确认即可)
git commit # 或 git commit -m "解决合并冲突:整合1和2的修改"
步骤 3:推送最终代码到远程
git push
此时远程仓库会变成整合后的新版本(比如同时包含 b 和 c 的修改)。
解决方法:撤销git pull
回到执行该命令前的仓库状态(相当于 “撤回” 这次失败的合并)。
执行以下命令,直接终止当前未完成的合并流程,恢复到 pull 前的状态:
git reset --merge
- 这个命令的作用:完全撤销本次未完成的合并,本地代码、提交记录都会回到执行
git pull --allow-unrelated-histories之前的样子; - 适用场景:冲突太多不想处理、合并操作本身有误,想重新规划合并方式(比如先备份代码再合并)。
补充:什么叫同一个文件的同一部分
“同一个文件的同一部分” 是 Git 判定「合并冲突」的核心依据,简单来说就是:程序员 1 和程序员 2 修改了「同一个文件」里的「相同行 / 相邻行 / 有重叠的代码块」,Git 无法自动判断该保留哪一方的修改,因此触发手动冲突解决。
用具体例子理解(最直观)
假设初始代码文件 demo.js(版本 a)的内容是:
// 初始版本a
function calculatePrice() {
let price = 100;
let discount = 0.8;
return price * discount; // 第5行
}
例子 1:修改了「同一行」(典型的 “同一部分”)
- 程序员 1 修改:把第 5 行的
0.8改成0.7(版本 b):return price * 0.7; // 第5行 - 程序员 2 修改:把第 5 行的
0.8改成0.9(版本 c):return price * 0.9; // 第5行
此时 Git 拉取合并时,会判定「同一文件的同一行被双方修改」,触发冲突,冲突标记会出现在第 5 行:
<<<<<<< HEAD
return price * 0.9; // 程序员2的修改
=======
return price * 0.7; // 程序员1的修改
>>>>>>> [远程提交ID]
例子 2:修改了「相邻行 / 重叠代码块」(也算 “同一部分”)
- 程序员 1 修改:在第 3 行新增
let tax = 0.1;(版本 b):let price = 100; let tax = 0.1; // 新增第3行 let discount = 0.8; return price * discount * (1 + tax); // 修改第5行 - 程序员 2 修改:把第 3 行的
discount改成0.9,并删除第 5 行的计算逻辑(版本 c):let price = 100; let discount = 0.9; // 修改第3行 return price; // 修改第5行
此时 Git 会判定「第 3-5 行的代码块被双方修改且有重叠」,触发冲突 —— 因为双方的修改范围覆盖了同一个 “代码区域”,Git 无法自动整合。
反例:修改了「同一文件的不同部分」(无冲突)
- 程序员 1 修改:在函数外新增注释(版本 b):
// 价格计算函数(程序员1新增) function calculatePrice() { let price = 100; let discount = 0.8; return price * discount; } - 程序员 2 修改:在函数内新增日志(版本 c):
function calculatePrice() { let price = 100; let discount = 0.8; console.log("计算价格:", price); // 程序员2新增 return price * discount; }
此时 Git 能自动合并 —— 双方修改的是文件中完全不重叠的部分(一个在函数外,一个在函数内),Git 会直接把两处修改整合到一起,不会触发冲突。
核心判定逻辑(Git 的视角)
Git 合并时会对比「三个版本」:
- 共同祖先版本:初始的版本 a;
- 本地修改版本:程序员 2 的版本 c;
- 远程最新版本:程序员 1 的版本 b。
如果 Git 发现:
- 版本 b 和版本 c 对「同一行 / 连续多行代码」做了不同修改 → 判定为「同一部分」,触发冲突;
- 版本 b 和版本 c 修改的是「不重叠的行 / 不同文件」 → 判定为「不同部分」,自动合并。
总结
- “同一个文件的同一部分” = 双方修改了同一行、相邻行或重叠的代码块,Git 无法自动判断保留哪一方;
- 冲突的本质不是 “改了同一个文件”,而是 “改了文件中重叠的代码区域”;
- 只要修改的代码区域完全不重叠,即使是同一个文件,Git 也能自动合并,不会触发冲突。
简单记:改了同一个文件的 “同一行 / 挨着的行”= 同一部分(冲突);改了同一个文件的 “不挨着的行”= 不同部分(无冲突)。

672



被折叠的 条评论
为什么被折叠?



