轻松掌握 git 版本库管理

文/晨风不可依米 (2025.06.07)

图解 git 中 3 个存储区块

图解 git 中 3 个存储区块

  • 工作区(workspace):项目实际目录,可直接编辑内容。
  • 暂存区(index):也叫缓冲区;通过git add操作,将工作区变动内容添加到暂存区。
  • 本地仓库(repository):也叫版本库;保存了所有分支提交内容、日志记录,以及分支暂存区内容。通过git commit操作将暂存区的修改提交到本地仓库。另外,允许回滚到指定历史记录版本。

(图解失效后)用符解存储区块内容结构:(工作区)>(add)>((暂存区)>(commit)> 本地仓库)。可见,本地仓库包含暂存区;也就是说工作区提交的变动内容,优先(add)提交到本地仓库的暂存区;再通过暂存区(commit)提交到本地仓库的实际存储位置。




忽略文件的版本跟踪

  1. 在项目根目录下创建文件.gitignore。(在项目根目录下创建,是为了更好适配忽略规则项的寻址问题)
  2. 在文件.gitignore中定义忽略规则,每一行代表一个忽略规则项。(忽略规则项中可使用!进行排除,使用##进行注释)
  3. 常见忽略项:安装的模块依赖(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>:指定托管平台,将本地仓库与远程仓库建立关联;适用于托管在多个远程仓库场景(如githubgitee)。

  • 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表示默认platformbranch,后续可简化使用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>}:移除过往指定暂存工作区内容的快照记录;参数index0开始。
  • git stash pop:通过快照记录恢复工作区内容;会自动执行移除当前快照记录。

特别提醒

  • 工作区内容暂存(git stash),相当于做了个临时历史快照;类似浏览器的访问历史记录(可理解为历史链接)。
  • 工作区变动内容提交到暂存区(git add),相当于工作变动内容拷贝到暂存区(index);类似下载并保存所访问的网页资源(可理解为文件副本)。

其它命令

  • git blame <file>:查看指定文件的历史记录。(可见谁动了我的代码)

构建发行版

发行版,用于记录产品迭代的发布顺序。

  1. 登录github网页,进入到远程仓库。
  2. 点击releases,点击create a new release
  3. 填写发行版本信息(选择分支、版本号标签、发行版标题以及描述)。
  4. 点击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> agoyyyy-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 addgit commit等命令操作。
恢复工作区内容,只需要执行git reset --hard <commit_id>命令操作,就可以将工作区内容重置为本地仓库所指定提交记录内容。
特别注意:执行git reset命令后,工作区所作修改内容,将全部舍弃。

本地分支合并与变基场景

合并与变基规则

  • 双线分支原则项目存在主分支(main)和开发分支(dev
  • 平行最新原则主分支和开发分支的提交记录保持平行,且开发分支始终保持版本最新的源代码内容。
  • 禁止修改原则禁止在主分支修改内容,否则影响所有其它分支导致代码冲突;因此请务必保持主分支的稳定。
  • 合并内容原则开发分支采用(rebase)变基操作,扁平化线性提交日志记录;主分采用(merge)合并操作,保证主分支提交历史的稳定,同时又记录所有开发者的更改。

本地分支合并

分支合并,是指当前分支追加其它分支的内容,同时又保留所有开发者的修改记录。

  • git merge <sub_branch>: 当前分支合并指定分支,并自动生成合并日志记录。

合并操作流程

  1. 模块分支已开发至稳定待发布状态,等待主要分支来合并。
  2. 执行git checkout <主要分支>命令,切换到主要分支。
  3. 主要分支中,执行git pull命令拉取远程仓库分支内容,保证本地仓库与远程仓库版本内容同步;否则在后续执行git push命令时提交失败。
  4. 主要分支中,执行git merge <模块分支>命令,合并模块分支。
  5. 合并成功后,执行git push命令推送到远程仓库。
  6. 执行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问题仍旧存在等情形。
内容缺失,是指目录、文件未提交等情形。

修正提交流程

  1. 存在提交错误情形,请在工作区直接修改内容。
  2. 存在内容缺失情形,请通过执行git add <dir | file>命令将目录、文件标记提交状态。
  3. 执行git add .命令,统一将工作区所有变动内容标记提交状态。
  4. 执行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 '封装组件(弹窗、按钮、头像)'


关联托管平台的远程仓库

托管平台:通过管理远程仓库实现代码分享、协同开发的服务平台。
远程仓库:建立本地仓库副本,并存储在托管平台的程序资源。


关联托管平台的远程仓库流程

  1. 登录github网站,创建远程仓库project-name
  2. 关联远程仓库(多种方式
    2-1. 通过远程仓库仓库地址,在终端执行git clone <repository>到本地电脑。
    2-2: 在终端创建与远程仓库同名<project-name>项目,通过执行git remote add < platform -name> <repository>命令建立关联远程仓库。
  3. 执行git pull命令同步本地仓库与远程仓库内容状态。

代码远程提交冲突解决

代码远程提交冲突的根源,是开发者本地分支的版本状态低于远程分支的版本状态。也就是说,远程分支有了新的提交历史,本地分支没有及时同步远程分支的最新内容。
因此,在代码远程提交之前,需要始终保持与远程分支内容同步;可通过执行git pull命令拉取远程分支的最新内容。

重点理解git pull命令相当于git fetchgit merge <platform_name>/<branch_name>的组合命令。也就是说,拉取远程分支内容后,会自动执行合并操作,并产生一条合并日志记录。


自动合并解决代码冲突情形

自动合并解决代码冲突情形,一般发生在未修改同一处文件或内容,又或者存在多人修改同一文件,但未修改、覆盖同一处内容等情形。
通过执行git pull命令拉取远程分支内容后,会自动执行合并操作,终端会进入vim 编辑器模式,要求填写合并日志备注内容;可直接在键盘点击esc,按住shift + :,输入:wq后,可完成分支内容合并。


手动合并解决代码冲突情形

自动合并解决代码冲突情形,一般发生在多人修改同一文件,且存在反复修改、覆盖同一处内容情形。
通过执行git pull命令拉取远程分支内容后,会自动执行合并操作。由于多人反复修改、覆盖同一处内容; git 对同一处修改内容的选择无法决定,因此终端会提示合并失败,并在当前分支名(dev)标记为(dev|MERGING),让开发者手动解决本次代码冲突问题。
因此,开发者需要找推送远程分支的相关当事人协调沟通,对代码冲突内容进行取舍选择保留(修改前修改后共存)内容,以避免程序功能不完整。




远程仓库分叉与提议

远程仓库分叉(fork

远程仓库分叉,是基于原始项目创建独立副本(不影响原始项目),同时又保留原始项目的提交日志记录。常用于对原始项目二次开发的场景。

远程仓库分叉操作流程

  1. 登录github网站,找到指定原始项目,点击fork操作,会自动跳转并在自己的仓库下创建原始仓库的副本。
  2. 副本项目的路径,一般都是https://github.com/<your-username>/<original-project>
  3. 你可以通过终端执行git clone https://github.com/<your-username>/<original-project>命令,拉取到本地进行二次开发,不影响原始项目。
  4. 当你追加开发的模块功能完毕,记得打上标签,备注模块功能信息。如果你有意贡献代码,那么请向原始项目所有者提议合并操作。

远程仓库提议(pull request

远程仓库提议,对基于原始仓库(fork)的二次开发,向原始仓库所有者提议(申请)合并到原始项目的远程仓库。常用于二次开发者向原始项目贡献代码的场景。

远程仓库提议操作流程

  1. 登录github网站,找到你基于原始项目二次开发的副本项目,在contribute 上点击open pull request,会自动跳转到填写提议合并的表单页面。
  2. 确认选择原始项目(base repository)的指定分支,以及副本项目(head repository)的指定分支,并填写副本项目变动内容的详细功能描述,最后点击create pull request按钮,完成向原始项目所有者提议合并申请。(到达这一步,你的流程已结束)
  3. 原始项目所有者会收到你贡献代码的提议(申请),并审查你的代码,再决定是否合并到原始项目的远程仓库。
  4. 如果你贡献代码的提议(申请)得到合并确认,那你就成为原始项目的维护者之一。



文章收获

  • 如果觉得对你有所帮助,请点下“推荐”吧!
  • 如果担心文忘记章地址,请点下“收藏”吧!
  • 如果对博主文章内容喜欢,可进行“关注”博主,更好地获悉最新文章内容。

posted @ 2025-06-08 02:02  晨风不可依米  阅读(80)  评论(0)    收藏  举报