Git的基本术语解释
版本库(Repository)
版本库是Git的核心概念,指的是一个包含项目所有历史记录和元数据的数据库。每个Git项目都有一个隐藏的.git目录,这就是版本库所在位置。版本库分为两种类型:
- 裸仓库(Bare Repository):没有工作区的纯版本库,通常用于服务器端共享
- 非裸仓库(Non-bare Repository):包含工作目录的开发版本库
创建新版本库的命令:
# 初始化新仓库
git init
# 克隆现有仓库
git clone https://github.com/user/repo.git
工作区(Working Directory)
工作区是开发者直接编辑文件的目录,也称为工作目录或工作树。它包含项目的当前状态,但不包含Git的版本控制信息。工作区中的文件有三种状态:
- 已修改(Modified):文件被更改但未暂存
- 已暂存(Staged):修改已标记为准备提交
- 已提交(Committed):修改已安全保存在本地数据库中
查看工作区状态:
git status
暂存区(Staging Area)
暂存区是Git特有的概念,也称为索引(Index)。它像一个缓冲区,存放即将提交的更改。暂存区允许开发者选择性地提交部分修改。
操作暂存区的常用命令:
# 添加文件到暂存区
git add file.js
# 添加所有更改
git add .
# 交互式添加
git add -p
提交(Commit)
提交是Git中的基本操作单元,代表项目在某个时间点的完整快照。每个提交都有唯一的SHA-1哈希值作为ID。
提交示例:
git commit -m "修复登录页面样式问题"
提交包含以下元数据:
- 作者信息
- 提交者信息
- 时间戳
- 提交消息
- 父提交指针
分支(Branch)
分支是指向特定提交的轻量级可移动指针。Git的分支机制非常高效,创建和切换分支几乎不消耗额外资源。
分支操作示例:
# 创建新分支
git branch feature-auth
# 切换分支
git checkout feature-auth
# 创建并切换分支
git checkout -b hotfix
Git默认有一个主分支(通常叫master或main),所有开发都从它派生。
标签(Tag)
标签是特定提交的静态引用,常用于标记发布版本。与分支不同,标签创建后通常不会移动。
标签类型:
- 轻量标签(Lightweight):简单的提交指针
- 附注标签(Annotated):包含完整信息的独立对象
标签操作:
# 创建轻量标签
git tag v1.0.0
# 创建附注标签
git tag -a v1.1.0 -m "正式发布版本1.1.0"
# 推送标签到远程
git push origin v1.1.0
远程(Remote)
远程是指向其他版本库的引用,通常是团队共享的中央仓库。最常见的远程名称是origin。
远程操作示例:
# 查看远程
git remote -v
# 添加远程
git remote add upstream https://github.com/original/repo.git
# 获取远程更新
git fetch origin
# 推送分支
git push origin main
合并(Merge)
合并是将不同分支的修改整合到一起的操作。Git支持多种合并策略:
- 快进合并(Fast-forward):当目标分支是当前分支的直接祖先时
- 三方合并(3-way merge):当分支出现分叉时创建新的合并提交
合并示例:
# 切换到主分支
git checkout main
# 合并特性分支
git merge feature-branch
解决合并冲突时,Git会在文件中标记冲突部分:
<<<<<<< HEAD
const apiVersion = 'v2';
=======
const apiVersion = 'v3';
>>>>>>> feature-api
变基(Rebase)
变基是另一种整合分支更改的方式,它会重新应用提交到新的基础提交上,使历史更加线性。
变基操作:
git checkout feature
git rebase main
交互式变基允许修改提交历史:
git rebase -i HEAD~3
检出(Checkout)
检出操作用于切换分支或恢复工作区文件。在Git 2.23+版本中,部分功能被switch和restore命令替代。
检出示例:
# 切换分支(旧方式)
git checkout develop
# 切换分支(新方式)
git switch develop
# 恢复文件(旧方式)
git checkout -- file.js
# 恢复文件(新方式)
git restore file.js
引用(Ref)
引用是指向提交的指针,包括:
- 分支引用(refs/heads/)
- 标签引用(refs/tags/)
- 远程跟踪分支(refs/remotes/)
查看引用日志:
git reflog
HEAD
HEAD是一个特殊指针,指向当前所在的本地分支或特定提交(分离HEAD状态)。在.git目录中,HEAD通常是一个符号引用。
查看HEAD指向:
cat .git/HEAD
钩子(Hooks)
钩子是Git在特定事件发生时自动运行的脚本,存储在.git/hooks目录中。常见钩子包括:
- pre-commit:提交前运行
- post-merge:合并后运行
- pre-push:推送前运行
示例pre-commit钩子:
#!/bin/sh
npm run lint
子模块(Submodule)
子模块允许将一个Git仓库作为另一个仓库的子目录,保持独立的版本控制。
子模块操作:
# 添加子模块
git submodule add https://github.com/user/lib.git
# 初始化子模块
git submodule init
# 更新子模块
git submodule update
工作流(Workflow)
Git支持多种协作工作流,常见的有:
- 集中式工作流:类似SVN,单一中央仓库
- 功能分支工作流:每个功能在独立分支开发
- Git Flow:严格的分支模型,含develop、release等分支
- GitHub Flow:简化的工作流,强调持续部署
差异比较(Diff)
Git提供多种查看差异的方式:
# 工作区与暂存区差异
git diff
# 暂存区与最后一次提交差异
git diff --cached
# 两次提交间差异
git diff commit1 commit2
# 统计变更
git diff --stat
储藏(Stash)
储藏临时保存工作区和暂存区的修改,便于切换上下文:
# 储藏当前修改
git stash
# 查看储藏列表
git stash list
# 恢复最近储藏
git stash pop
# 创建命名储藏
git stash push -m "WIP: auth feature"
重置(Reset)
重置命令用于移动HEAD和当前分支指针:
# 软重置(只移动指针)
git reset --soft HEAD~1
# 混合重置(默认,移动指针并重置暂存区)
git reset HEAD~1
# 硬重置(移动指针、重置暂存区和工作区)
git reset --hard HEAD~1
恢复(Restore)
Git 2.23+引入的新命令,专门用于恢复文件:
# 丢弃工作区修改
git restore file.js
# 从特定提交恢复文件
git restore --source=HEAD~2 file.js
# 取消暂存
git restore --staged file.js
二分查找(Bisect)
用于快速定位引入错误的提交:
git bisect start
git bisect bad
git bisect good v1.0
# 测试后标记当前提交为good或bad
git bisect reset
补丁(Patch)
生成和应用补丁文件:
# 生成补丁
git format-patch HEAD~2
# 应用补丁
git am *.patch
凭证存储(Credential Storage)
Git提供多种凭证存储方式:
# 缓存凭证(默认15分钟)
git config --global credential.helper cache
# 长期存储
git config --global credential.helper store
# 使用系统钥匙串
git config --global credential.helper osxkeychain
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
上一篇:Git工作流程概述