阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > Git的基本术语解释

Git的基本术语解释

作者:陈川 阅读数:35478人阅读 分类: 开发工具

版本库(Repository)

版本库是Git的核心概念,指的是一个包含项目所有历史记录和元数据的数据库。每个Git项目都有一个隐藏的.git目录,这就是版本库所在位置。版本库分为两种类型:

  1. 裸仓库(Bare Repository):没有工作区的纯版本库,通常用于服务器端共享
  2. 非裸仓库(Non-bare Repository):包含工作目录的开发版本库

创建新版本库的命令:

# 初始化新仓库
git init

# 克隆现有仓库
git clone https://github.com/user/repo.git

工作区(Working Directory)

工作区是开发者直接编辑文件的目录,也称为工作目录或工作树。它包含项目的当前状态,但不包含Git的版本控制信息。工作区中的文件有三种状态:

  1. 已修改(Modified):文件被更改但未暂存
  2. 已暂存(Staged):修改已标记为准备提交
  3. 已提交(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)

标签是特定提交的静态引用,常用于标记发布版本。与分支不同,标签创建后通常不会移动。

标签类型:

  1. 轻量标签(Lightweight):简单的提交指针
  2. 附注标签(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支持多种合并策略:

  1. 快进合并(Fast-forward):当目标分支是当前分支的直接祖先时
  2. 三方合并(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支持多种协作工作流,常见的有:

  1. 集中式工作流:类似SVN,单一中央仓库
  2. 功能分支工作流:每个功能在独立分支开发
  3. Git Flow:严格的分支模型,含develop、release等分支
  4. 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

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌