轻松掌握 git 版本库管理
文/晨风不可依米 (2025.06.07)
图解 git 中 3 个存储区块

- 工作区(
workspace):项目实际目录,可直接编辑内容。 - 暂存区(
index):也叫缓冲区;通过git add操作,将工作区变动内容添加到暂存区。 - 本地仓库(
repository):也叫版本库;保存了所有分支提交内容、日志记录,以及分支暂存区内容。通过git commit操作将暂存区的修改提交到本地仓库。另外,允许回滚到指定历史记录版本。
(图解失效后)用符解存储区块内容结构:(工作区)>(add)>((暂存区)>(commit)> 本地仓库)。可见,本地仓库包含暂存区;也就是说工作区提交的变动内容,优先(add)提交到本地仓库的暂存区;再通过暂存区(commit)提交到本地仓库的实际存储位置。
忽略文件的版本跟踪
- 在项目根目录下创建文件
.gitignore。(在项目根目录下创建,是为了更好适配忽略规则项的寻址问题) - 在文件
.gitignore中定义忽略规则,每一行代表一个忽略规则项。(忽略规则项中可使用!进行排除,使用##进行注释) - 常见忽略项:安装的模块依赖(
node_modules)、构建自动生成内容(dist)、敏感配置内容(.env)等。
特别注意:已被版本库标记追踪的内容,文件.gitignore中再定义忽略规则不再适用。因此,建议在项目初始化时应当决定哪些内容不被标记追踪,以免被提交到远程仓库。
版本库管理
初始化配置命令
git init:初始化git仓库,,并生成目录.git,保存版本库信息。git clone <repostory>:克隆远程仓库初始化到本地。git config user.name <name>:设置本地仓库当前开发者昵称。git config user.email <email>:设置本地仓库当前开发者邮箱。
本地分支管理命令
-
git branch:查看本地分支。 -
git branch -a:查看所有分支。 -
git branch -m <new_branch_name>:为当前分支重命名。 -
git branch <branch_name>:创建本地分支。 -
git branch -d <branch_name>:删除本地分支。 -
git branch -D <branch_name>:删除本地分支;适用于本地分支有未合并的提交场景来强制删除。
-
git remote -v:显示本地仓库所关联的远程仓库名称和存储位置。 -
git remote add <platform_name> <repository>:指定托管平台,将本地仓库与远程仓库建立关联;适用于托管在多个远程仓库场景(如github、gitee)。 -
git remote remove <platform_name>:指定托管平台,移除本地仓库与远程仓库的关联。 -
git remote show <platform_name>:查看远程仓库信息。 -
git remote rename <old-platform> <new-platform>:重命名远程仓库名称。 -
git remote set-url <platform_name> <repository>:设置本地仓库所关联远程仓库访问路径。
-
git status:查看本地仓库变动状态。 -
git add <dir | file | .>:将工作区变动内容提交到暂存区。 -
git checkout <dir | file | .>:撤销未提交到暂存区的修改。 -
git checkout <commit_id> <dir | file | .>:撤销已提交到暂存区的修改。 -
git reset --hard HEAD~1:撤销上次已提交到本地仓库的修改。 -
git reset --hard <commit_id>:时光回溯到指定commit_id提交日志记录的内容。 -
git commit -m <message>:将暂存区变动内容提交到本地仓库,并记录提交内容。 -
git commit --amend -m <message>:修正上一次提交内容,不产生新的提交日志记录;可理解为重写上一次的提交日志记录。 -
git merge <sub_branch>:合并指定分支内容,会自动生成合并日志记录;常用于主分支合并其它稳定分支。 -
git rebase <main_branch>:将指定分支的最新日志节点作为当前分支的基底,即当前分支的后续提交日志记录会在指定分支的最新日志节点之后;常用于非主分支提交前的操作。 -
git rebase -i <commit_id>:对指定commit_id提交日志记录之后的日志记录进行压缩处理;终端设置squash your_commit_id后,即your_commit_id的提交日志记录内容将与它的上一个提交记录进行合并,并会提示要求重新提交日志记录。
-
git push <platform_name> --all:推送本地所有分支内容到远程仓库对应的分支。 -
git push -u <platform_name> <branch_name>:推送本地指定分支内容到远程仓库;参数-u表示默认platform、branch,后续可简化使用git push进行推送。
远程分支管理命令
git branch -r:查看远程分支。git pull <platform_name> <branch_name>:拉取远程仓库指定分支内容到本地分支,并自动合并内容。git push <platform_name> --delete <branch_name>:删除远程仓库指定分支。
本地标签管理命令
分支标签,本质上是对提交记录的别名,常用于管理版本库阶段迭代、版本发布等。
git tag <tag_name>:为当前提交记录创建轻量标签。git tag <tag_name> <commit_id>:为指定提交记录创建轻量标签。git tag -a <tag_name> -m <tag_message>:为当前提交记录创建备注标签。git tag:查看本地标签列表。git tag -d <tag_name>:删除本地标签。git tag -l <pattern>:匹配查找本地标签。git show <tag_name>:查看本地指定标签信息。git push <platform_name> --tags:推送本地所有标签内容到远程仓库。git push <platform_name> <tag_name>:推送本地指定标签内容到远程仓库。
远程标签管理命令
git ls-remote --tags <platform_name>:查看远程仓库的标签列表。git push <platform_name> --delete tags/<tag_name>:删除远程仓库指定标签内容。git push <platform_name> -d <tag_name>:删除远程仓库指定标签内容。
内容差异对比命令
内容差异,主要用于修改前后、代码冲突等内容的参照。
git diff <file>:查看工作区和暂存区的内容差异;即git add操作前后的内容差异。git diff --cached <file>:查看暂存区和本地仓库的内容差异;即git commit操作前后的内容差异。git diff HEAD <file>:查看工作区和本地仓库的内容差异;即当前修改内容与分支记录内容的差异。git diff --stat:显示差异的简化统计信息。git diff --color:用颜色显示差异内容,方便阅读、内容对比。
工作区内容暂存命令
工作区内容暂存与恢复,常用于紧急处理其它事务,暂存或恢复当前工作区内容的场景。
git stash:通过快照记录暂存工作区内容。git stash list:查看过往暂存工作区内容的快照记录列表。git stash clear:清除过往所有暂存工作区内容的快照记录列表。git stash drop stash@{<index>}:移除过往指定暂存工作区内容的快照记录;参数index从0开始。git stash pop:通过快照记录恢复工作区内容;会自动执行移除当前快照记录。
特别提醒:
- 工作区内容暂存(
git stash),相当于做了个临时历史快照;类似浏览器的访问历史记录(可理解为历史链接)。 - 工作区变动内容提交到暂存区(
git add),相当于工作变动内容拷贝到暂存区(index);类似下载并保存所访问的网页资源(可理解为文件副本)。
其它命令
git blame <file>:查看指定文件的历史记录。(可见谁动了我的代码)
构建发行版
发行版,用于记录产品迭代的发布顺序。
- 登录
github网页,进入到远程仓库。 - 点击
releases,点击create a new release。 - 填写发行版本信息(选择分支、版本号标签、发行版标题以及描述)。
- 点击
publish release,完成发行版本。
特别注意:标签遵循v<X>.<Y>.<Z>[-alpha]语义化版本范式;每位版本号只能增加,不能衰减。
X:主版本号。常用于重大更新所致无法兼容的版本变动,以及重要里程碑阶段。Y:次版本号。常用于向后兼容(不破坏旧版功能)的功能性增加。Z:修订号。常用于向后兼容的问题修正;如bug修复。-alpha:待发布号。常用于产品稳定(延迟)待发布的标识,并在发布后删除该标签。
提交日志管理
查看分支日志记录
git log:显示分支日志记录。git log --stat:显示更改的统计信息。git log --patch:显示更改的详细内容。git lig -<n>:查看最新n条日志记录。git log --graph:图形化显示日志记录。git log --oneline:单行显示日志记录。
筛选分支日志记录
git log --grep=<keyword>:根据包含关键字筛选日志记录。git log --author=<name | email>:根据开发者信息筛选日志记录。git log --after=<date>:筛选指定日期之后的日志记录,不包含指定日期的日志记录。git log --before=<date>:筛选指定日期之前的日志记录,包含指定日期的日志记录。git log --after=<date> --before=<date>:筛选指定日期范围内的日志记录。
特别提醒:参数date可用<number> <day | week | month> ago或yyyy-mm-dd等范式配置。
显示更改统计信息日志(学会分析 git log --stat)
Author: chenfengbukeyimi <chenfengbukeyimi@qq.com>
Date: Fri Jun 6 06:41:04 2025 +0800
初始化 github 主页介绍
README.md | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 94 insertions(+), 2 deletions(-)
## 以上日志信息可获悉
- 版本库作者:`Author: chenfengbukeyimi <chenfengbukeyimi@qq.com>`
- 版本库提交时间:`Date: Fri Jun 6 06:41:04 2025 +0800`
- 版本库提交备注:`初始化 github 主页介绍`
- 版本库提交文件:`README.md`
- 版本库变动描述;`1 个文件发生变动,94 行内容发生覆盖或插入,2 行内容被移除`
显示更改统计信息日志(学会分析 git log --patch)
Author: chenfengbukeyimi <chenfengbukeyimi@qq.com>
Date: Fri Jun 6 06:41:04 2025 +0800
初始化 github 主页介绍
diff --git a/README.md b/README.md
index 7bf1632..1d686c9 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,99 @@
+## 个人简介
+
+👋 我是莫健峰,拥有实际 4.5 年程序开发经验。
+
+- 微信;`chenfengbukeyimi`
+- 邮箱:`chenfengbukeyimi@qq.com`
+ 更多内容已被省略...
## 以上日志信息可获悉
- 版本库作者:`Author: chenfengbukeyimi <chenfengbukeyimi@qq.com>`
- 版本库提交时间:`Date: Fri Jun 6 06:41:04 2025 +0800`
- 版本库提交备注:`初始化 github 主页介绍`
- 版本库提交文件:`README.md`
- 内部自动调用`diff`命令,对比了本次提交的文件内容变动(前缀`a` 或 `3个-符号` 代表修改前,`b` 或 `3个+符号` 代表修改后)。
- 文件修改的来源、文件类型和文件权限:`index <修改前版本7位 hash 值>..<修改后版本7位 hash 值> <前3位为文件类型,后3位为文件权限>`
特别提示:
- 文件类型:文件
100、符号链接101、目录102,详见请自查资料。 - 文件权限:无权限
0、可执行权限1、可写权限2、可读权限4。文件权限由3位数组成,每位取值范围为0-7,从左往右分别代表所有者、群组、其它用户。
查看引用日志记录( 重点理解)
引用日志记录,是指本地仓库所有git操作的提交记录;它包含(git log命令可见的)分支日志记录,以及未被迁移同步到分支日志记录的其它日志记录。
git reflog:查看本地仓库所有git操作的提交记录。
重要区别
- 分支日志记录(
git log):无法同步修正提交等相关日志记录;故无法通过git log命令查看得到。 - 引用日志记录(
git reflog):本地仓库所有git操作的提交记录;故可以查询本地仓库所有提交相关的日志记录。对于无法(非push到远程)随分支迁移同步的提交日志记录,本地默认保留90天有效期。
版本库案例场景
本地仓库工作区内容恢复
未提交到暂存区的处理方案
未提交到暂存区,也就是没有执行过git add命令操作。
恢复工作区内容,只需要执行git checkout <file | .>命令操作,就可以完成内容恢复。
已提交到暂存区且未提交到本地仓库的处理方案
已提交到暂存区且未提交到本地仓库,也就是已执行git add命令,但没有执行git commit命令操作。
由于已提交到暂存区过,工作区与暂存区的内容一致;因此无法通过执行git checkout <file | .>命令操作来恢复内容。
恢复工作区内容,只需要执行git checkout <commit_id> <file | .>命令操作,就可以将本地仓库所指定提交记录内容重新覆盖到工作区内容。
已提交到本地仓库的处理方案
已提交到本地仓库,也就是已执行git add、git commit等命令操作。
恢复工作区内容,只需要执行git reset --hard <commit_id>命令操作,就可以将工作区内容重置为本地仓库所指定提交记录内容。
特别注意:执行git reset命令后,工作区所作修改内容,将全部舍弃。
本地分支合并与变基场景
合并与变基规则
- 双线分支原则:项目存在主分支(
main)和开发分支(dev)。 - 平行最新原则:主分支和开发分支的提交记录保持平行,且开发分支始终保持版本最新的源代码内容。
- 禁止修改原则:禁止在主分支修改内容,否则影响所有其它分支导致代码冲突;因此请务必保持主分支的稳定。
- 合并内容原则:开发分支采用(
rebase)变基操作,扁平化线性提交日志记录;主分采用(merge)合并操作,保证主分支提交历史的稳定,同时又记录所有开发者的更改。
本地分支合并
分支合并,是指当前分支追加其它分支的内容,同时又保留所有开发者的修改记录。
git merge <sub_branch>: 当前分支合并指定分支,并自动生成合并日志记录。
合并操作流程
- 模块分支已开发至稳定待发布状态,等待主要分支来合并。
- 执行
git checkout <主要分支>命令,切换到主要分支。 - 主要分支中,执行
git pull命令拉取远程仓库分支内容,保证本地仓库与远程仓库版本内容同步;否则在后续执行git push命令时提交失败。 - 主要分支中,执行
git merge <模块分支>命令,合并模块分支。 - 合并成功后,执行
git push命令推送到远程仓库。 - 执行
git checkout <模块分支>命令,切换到模块分支。(防止滞留在主要分支)
本地分支变基
分支变基,是指主要分支存在新的提交历史记录,模块分支应当接续主要分支的最新提交历史记录作为基底,并形成提交次序的扁平化日志记录。
git rebase <main_branch>:将指定分支的最新日志节点作为当前分支的基底,即当前分支的后续提交日志记录会在指定分支的最新日志节点之后,形成提交次序的扁平化日志记录。
案例与变基操作流程
1. 初始化主分支 main,历史记录备注为 'main-1'。(主分支历史记录节点: ‘mian-1’)
2. 用户 A 与用户 B 分别创建分支 ‘devA’、‘devB’。
3. 用户 A 开发模块功能A1。历史记录备注为 ‘devA-A1’。用户 B 分别开发模块功能 B1。历史记录分别备注为 ‘devA-B1-1’、‘devA-B1-2’。用户 A、B的分支等待主分支合并。
4. 此时,用户 B 的分支历史记录节点: ‘mian-1’ > ‘devA-B1-1’、‘devA-B1-2’。
5. 主分支 main 合并用户 A 的分支 ‘devA’ 内容。(主分支历史记录节点: ‘mian-1’ > ‘devA-A1’)。
6. 由于主分支有新的提交历史记录,为保证扁平化的线性提交历史记录,即用户 B 的分支历史记录节点: ‘mian-1’ > ‘devA-A1’ > ‘devA-B1-1’、‘devA-B1-2’。
7. 用户 B 应当采用变基操作来接续形成提交次序的扁平化日志记录。故用户 B 在功能开发完毕后会执行以下操作。
- 切换到主分支 main,拉取最新内容;保证本地主分支与远程主分支同步。
- 切换到用户 B 的分支 devB,通过变基操作(`git rebase main`)接续形成线性提交历史记录。
- 现象对比:变基前的用户B分支历史记录( ‘mian-1’ > ‘devA-B1-1’、‘devA-B1-2’),变基后的用户B分支历史记录(‘mian-1’ > ‘devA-A1’ > ‘devA-B1-1’、‘devA-B1-2’)。
8. 主分支 main 可以顺利合并用户 B 的分支 devB。(若没有进行步骤7,将导致部分内容遗失或合并报错)。
用户 B 功能开发提交在 devB 后,操作命令如下:
## 主分支拉取最新内容
git checkout main
git pull
## 用户 B 分支变基操作
git checkout devB
git rebase main
## 主分支 main 合并用户 B 分支 devB
git checkout main
git merge devB
## 合并完成,禁止滞留在主分支,应当返回用户 B 分支
git checkout devB
本地分支修正提交
本地分支修正提交,是指通过git commit --amend操作来覆盖上一次提交内容、历史记录备注等信息。因此,在分支日志记录中不会产生本次修正提交的历史记录。
本地分支合并提交记录
提交错误、内容缺失情形
提交错误,是指未正确修改内容、bug问题仍旧存在等情形。
内容缺失,是指目录、文件未提交等情形。
修正提交流程:
- 存在
提交错误情形,请在工作区直接修改内容。 - 存在
内容缺失情形,请通过执行git add <dir | file>命令将目录、文件标记提交状态。 - 执行
git add .命令,统一将工作区所有变动内容标记提交状态。 - 执行
git commit --amend -m <修正提交备注>命令,完成修正提交操作。其中参数修正提交备注会覆盖上一次提交的日志备注。
模块开发可能产生多条冗余、模糊日志情形
在开发项目中,遇到周期性较长的模块开发,可能产生多条冗余、模糊的模块开发历史日志。为了避免在开发中产生该情形,应当防微杜渐,避免这种情形发生。
案例与修正提交流程
## 未修正提交情形(开发分支 dev)
log-1:初始化项目
log-2:构建项目模板
log-3:封装组件-弹窗组件
log-4:封装组件-按钮组件
log-5:封装组件-头像组件
以上提交历史记录,均由执行`git add`、`git commit -m <日志记录备注>`命令所形成。
可以发现,提交日志记录第3-5条,都是在封装组件;若主分支合并该分支内容,会产生多条冗余“封装组件”模块的提交日志记录。
## 已修正提交情形(开发分支 dev)
log-1:初始化项目
log-2:构建项目模板
log-3:封装组件(弹窗、按钮、头像)
以上提交日志记录第1-3条,均由执行`git add`、`git commit -m <日志记录备注>`所形成。
但在提交日志记录第4、5条,通过执行`git commit --amend -m <日志记录备注>`命令所形成。
该修正提交命令操作是通过覆盖上一次提交内容、历史记录备注等信息;因此不会在分支日志记录上额外产生2次修正的日志记录。
本案例修正提交命令操作过程的命令如下:
// 第 4 次提交操作
git add .
git commit -amend -m '封装组件(弹窗、按钮)'
// 第 5 次提交操作
git add .
git commit -amend -m '封装组件(弹窗、按钮、头像)'
关联托管平台的远程仓库
托管平台:通过管理远程仓库实现代码分享、协同开发的服务平台。
远程仓库:建立本地仓库副本,并存储在托管平台的程序资源。
关联托管平台的远程仓库流程
- 登录
github网站,创建远程仓库project-name。 - 关联远程仓库(
多种方式)
2-1. 通过远程仓库仓库地址,在终端执行git clone <repository>到本地电脑。
2-2: 在终端创建与远程仓库同名<project-name>项目,通过执行git remote add < platform -name> <repository>命令建立关联远程仓库。 - 执行
git pull命令同步本地仓库与远程仓库内容状态。
代码远程提交冲突解决
代码远程提交冲突的根源,是开发者本地分支的版本状态低于远程分支的版本状态。也就是说,远程分支有了新的提交历史,本地分支没有及时同步远程分支的最新内容。
因此,在代码远程提交之前,需要始终保持与远程分支内容同步;可通过执行git pull命令拉取远程分支的最新内容。
重点理解:git pull命令相当于git fetch和git merge <platform_name>/<branch_name>的组合命令。也就是说,拉取远程分支内容后,会自动执行合并操作,并产生一条合并日志记录。
自动合并解决代码冲突情形
自动合并解决代码冲突情形,一般发生在未修改同一处文件或内容,又或者存在多人修改同一文件,但未修改、覆盖同一处内容等情形。
通过执行git pull命令拉取远程分支内容后,会自动执行合并操作,终端会进入vim 编辑器模式,要求填写合并日志备注内容;可直接在键盘点击esc,按住shift + :,输入:wq后,可完成分支内容合并。
手动合并解决代码冲突情形
自动合并解决代码冲突情形,一般发生在多人修改同一文件,且存在反复修改、覆盖同一处内容情形。
通过执行git pull命令拉取远程分支内容后,会自动执行合并操作。由于多人反复修改、覆盖同一处内容; git 对同一处修改内容的选择无法决定,因此终端会提示合并失败,并在当前分支名(dev)标记为(dev|MERGING),让开发者手动解决本次代码冲突问题。
因此,开发者需要找推送远程分支的相关当事人协调沟通,对代码冲突内容进行取舍选择保留(修改前、修改后、共存)内容,以避免程序功能不完整。
远程仓库分叉与提议
远程仓库分叉(fork)
远程仓库分叉,是基于原始项目创建独立副本(不影响原始项目),同时又保留原始项目的提交日志记录。常用于对原始项目二次开发的场景。
远程仓库分叉操作流程
- 登录
github网站,找到指定原始项目,点击fork操作,会自动跳转并在自己的仓库下创建原始仓库的副本。 - 副本项目的路径,一般都是
https://github.com/<your-username>/<original-project>。 - 你可以通过终端执行
git clone https://github.com/<your-username>/<original-project>命令,拉取到本地进行二次开发,不影响原始项目。 - 当你追加开发的模块功能完毕,记得打上标签,备注模块功能信息。如果你有意贡献代码,那么请向原始项目所有者提议合并操作。
远程仓库提议(pull request)
远程仓库提议,对基于原始仓库(fork)的二次开发,向原始仓库所有者提议(申请)合并到原始项目的远程仓库。常用于二次开发者向原始项目贡献代码的场景。
远程仓库提议操作流程
- 登录
github网站,找到你基于原始项目二次开发的副本项目,在contribute上点击open pull request,会自动跳转到填写提议合并的表单页面。 - 确认选择原始项目(
base repository)的指定分支,以及副本项目(head repository)的指定分支,并填写副本项目变动内容的详细功能描述,最后点击create pull request按钮,完成向原始项目所有者提议合并申请。(到达这一步,你的流程已结束) - 原始项目所有者会收到你贡献代码的提议(申请),并审查你的代码,再决定是否合并到原始项目的远程仓库。
- 如果你贡献代码的提议(申请)得到合并确认,那你就成为原始项目的维护者之一。
文章收获
- 如果觉得对你有所帮助,请点下“推荐”吧!
- 如果担心文忘记章地址,请点下“收藏”吧!
- 如果对博主文章内容喜欢,可进行“关注”博主,更好地获悉最新文章内容。

浙公网安备 33010602011771号