第 1 卷
Git 中 Pull、Fetch、Merge 和 Rebase 的差异
解析
一、Git与SVN的本质区别
Git和SVN(Subversion)的核心差异在于版本控制系统的架构类型,这决定了两者的核心行为差异:
- 架构类型不同(核心本质)
◦ Git:分布式版本控制系统(DVCS)。每个开发者本地都会完整克隆整个仓库的所有版本历
史、分支、标签等数据,无需依赖中央服务器即可完成提交、分支创建、版本回溯等核心操作,仅在需要同步协作时与远程仓库交互。
◦ SVN:集中式版本控制系统(CVCS)。所有版本历史、分支信息都存储在唯一的中央服务器
上,开发者本地仅保留当前工作副本的文件,几乎所有核心操作(提交、更新、查看历史)都必须联网依赖中央服务器。
- 其他关键衍生差异
◦ 离线工作能力:Git支持完全离线工作(本地提交、版本对比等),SVN无网络无法进行版本相
关操作;
◦ 分支/标签效率:Git的分支/标签是轻量级的(仅指向特定提交的指针),创建、切换、合并几
乎瞬间完成;SVN的分支/标签是完整文件拷贝,操作缓慢且占用大量存储空间;
◦ 数据安全性:Git本地仓库完整备份,单个仓库损坏可通过其他开发者的本地仓库恢复;SVN中
央服务器损坏若无备份,所有版本历史丢失。
二、开发中常用的Git命令
按工作流程分类,核心常用命令如下:
- 仓库初始化与克隆
- git init:在当前目录初始化一个本地Git仓库;
- git clone <远程仓库地址>:克隆远程仓库到本地(完整拷贝所有版本历史)。
- 工作区与暂存区操作
- git add <文件名>:将指定文件的修改添加到暂存区;
- git add .:将当前目录下所有修改(新增、修改、删除)添加到暂存区;
◦ git status:查看工作区、暂存区的文件状态(哪些文件未跟踪、已修改未暂存、已暂存
- git diff:查看工作区与暂存区的文件差异;
- git diff:查看工作区与暂存区的文件差异;
- git diff --cached:查看暂存区与最近一次提交(HEAD)的差异。
- git commit -m "提交说明":将暂存区的修改提交到本地仓库,生成版本记录;
◦ git commit --amend:修改最近一次提交的说明(或补充暂存区的修改到最近一次提
交);
- git log:查看本地仓库的提交历史(按时间倒序排列);
- git log --oneline:简洁显示提交历史(仅显示提交ID前7位和提交说明)。
- 分支操作
- git branch:查看本地所有分支(当前分支前标 *);
- git branch <分支名>:创建新分支;
- git checkout <分支名>:切换到指定分支;
- git checkout -b <分支名>:创建并切换到新分支(常用快捷命令);
- git branch -d <分支名>:删除本地已合并的分支;
- git push origin <分支名>:将本地分支推送到远程仓库。
- 远程仓库与同步
- git remote -v:查看远程仓库的关联信息;
- git pull:拉取远程仓库对应分支的更新并合并到本地当前分支;
- git push:将本地当前分支的提交推送到远程对应分支;
- git fetch:拉取远程仓库的最新版本到本地(不自动合并)。
- 撤销与回滚
- git reset --hard <提交ID>:彻底回滚到指定提交版本,丢弃后续所有修改;
◦ git checkout -- <文件名>:撤销工作区中该文件的未暂存修改(恢复到暂存区或最近
提交状态);
- git rm --cached <文件名>:将文件从暂存区移除(保留本地文件,取消跟踪)。
三、Git分支冲突的解决方法
分支冲突通常发生在多个分支修改了同一文件的同一部分内容,且合并/拉取时Git无法自动合并的场景,解决步骤如下:
- 识别冲突:执行 git merge <分支名> 或 git pull 后,Git会提示“CONFLICT (content):
Merge conflict in <文件名>”,此时合并进入暂停状态;通过 git status 可查看冲突文件(标
◦ 打开冲突文件,Git会用特殊标记标注冲突区域:
1<<<<<<< HEAD(当前分支的内容)
2本地分支修改的代码 3=======(冲突分隔线)
4待合并分支修改的代码 5>>>>>>> <分支名/提交ID>(待合并分支的内容)
◦ 手动编辑文件:删除冲突标记(<<<<<<<、=======、>>>>>>>),根据业务需求保留正确代码
(可保留双方有效内容,或舍弃其中一方)。
- 标记冲突已解决:编辑完成后,将修改后的文件添加到暂存区,确认冲突解决:
Code block
1git add <冲突文件名>
- 完成合并/提交:
◦ 若为 git merge 触发的冲突:执行 git commit 即可完成合并(Git会自动生成合并提交说
明);
- 若为 git pull 触发的冲突:完成上述步骤后,合并自动完成(无需额外commit);
5.(可选)放弃合并(紧急情况):若冲突复杂暂时无法解决,可放弃当前合并,恢复到合并前状态:
Code block
1git merge --abort
四、Git rebase 与 merge 的区别
git rebase 和 git merge 的核心目的都是将一个分支的修改整合到另一个分支,但整合方式和提交历史表现截然不同:
- 核心原理差异
◦ git merge:合并提交(三方合并)。保留两个分支的原始提交历史,在两者的最新共同祖
先基础上,创建一个新的“合并提交”,将两个分支的修改整合到该提交中。
◦ git rebase:变基(重写提交历史)。将当前分支的所有提交,“移植”到目标分支的最
全站分卷索引 · 3 卷
- 1第 1 卷
- Git 中 Pull、Fetch、Merge 和 Rebase 的差异
- 解析
- 一、Git与SVN的本质区别
- ◦ Git:分布式版本控制系统(DVCS)。每个开发者本地都会完整克隆整个仓库的所有版本历
- ◦ SVN:集中式版本控制系统(CVCS)。所有版本历史、分支信息都存储在唯一的中央服务器
- ◦ 离线工作能力:Git支持完全离线工作(本地提交、版本对比等),SVN无网络无法进行版本相
- ◦ 分支/标签效率:Git的分支/标签是轻量级的(仅指向特定提交的指针),创建、切换、合并几
- ◦ 数据安全性:Git本地仓库完整备份,单个仓库损坏可通过其他开发者的本地仓库恢复;SVN中
- 二、开发中常用的Git命令
- ◦ git status:查看工作区、暂存区的文件状态(哪些文件未跟踪、已修改未暂存、已暂存
- ◦ git commit --amend:修改最近一次提交的说明(或补充暂存区的修改到最近一次提
- ◦ git checkout -- <文件名>:撤销工作区中该文件的未暂存修改(恢复到暂存区或最近
- 2第 2 卷
- ◦ git merge:提交历史是非线性的,会保留分支的分叉记录(可清晰看到何时创建分支、何
- ◦ git rebase:提交历史是线性的,会“抹平”分支分叉,看起来当前分支是在目标分支最
- ◦ git merge:适合**公共分支(如master/main、develop)**的合并,保留完整的分支历
- ◦ git rebase:适合**个人分支/功能分支(如feature/*)**整合公共分支更新,或在合并到
- ◦ 变基(rebase):分支A → 基于分支B最新版本变基 → 分支A的提交依次排在B最新提交之后
- 五、git pull 与 git fetch 的区别
- ◦ git fetch:仅拉取,不合并。将远程仓库的最新提交、分支信息拉取到本地的远程跟踪分
- ◦ git pull:拉取 + 自动合并。 git pull 本质上是 git fetch + git merge(默
- ◦ git fetch:更安全、更灵活。由于不自动合并,开发者可以通过 git diff <本地分支
- ◦ git pull:更便捷,但灵活性低、风险略高。适合本地分支无未提交修改、且确认远程更新
- ◦ git pull:适合个人开发分支快速同步远程更新(如个人feature分支拉取远程develop分
- 六、Git钩子(hook)的定义与用途
- 3第 3 卷
- ◦ 开启压缩:提升网络传输效率(默认开启,可确认配置):
- ◦ 关闭文件索引统计:对于海量文件仓库,关闭 git status 时的文件统计,提升速度:
- ◦ 增大缓存:调整Git的内存缓存大小,减少磁盘IO:
- ◦ 使用Git子模块(git submodule):将大型仓库拆分为多个独立子仓库,主仓库仅引用子仓库
- ◦ 使用Git LFS(Large File Storage):专门管理大文件(如图片、视频、二进制包等),不将大
- ◦ 清理无用数据:定期清理悬空提交、过期分支、大文件历史等,缩小仓库体积:
- ◦ 避免频繁操作全量历史:使用 git log --oneline --no-merges 等简洁命令查看历
- ◦ 使用稀疏检出(Sparse Checkout):仅检出工作区需要的目录,不下载所有文件,适用于仅
- 九、Git内部工作原理与文件变化跟踪机制
- ◦ Blob对象(二进制大对象):用于存储文件的内容数据,不包含文件名和目录结构,仅通过内
- ◦ Tree对象:用于描述目录结构,存储了目录下的文件名、对应Blob对象/子Tree对象的哈希值,
- ◦ Commit对象:用于记录一次提交的完整信息,包括:指向当前版本Tree对象的哈希值(对应