
目录1. 安装与初次配置1.1 各平台安装1.2 初次配置用户名和邮箱2. 工作区、暂存区、版本库.git 文件objectsGit 对象库git cat-file 用法3. 基本操作3.1 初始化仓库与首次提交git add 常用用法git commit 常用用法3.2 查看状态与差异git status 常用命令git diff 常用命令3.3 查看提交历史git log 常用用法git reflog 常用命令3.4 版本回退git resetHEADHEAD^1 和 HEAD~1 的区别3.5 撤销修改未提交/已暂存/已提交git checkout 常用命令3.6 删除文件4. 分支管理4.1 分支本质4.2 分支常用指令4.3 合并模式Fast-forward vs 普通合并4.4 合并冲突解决4.5 Bug 分支与 stash5. 远程操作分布式协作5.1 远程仓库概念5.2 SSH 公钥配置以 Gitee 为例5.3 克隆、推送与拉取5.4 远程分支管理6. 标签管理6.1 创建标签6.2 查看与推送标签6.3 删除标签7. 多人协作实战同一分支 多分支7.1 同一分支协作如 dev7.2 多分支协作feature 分支7.3 清理远程已删除的本地跟踪分支8. Git Flow 及变体8.1 常用环境与分支对应关系8.2 Git Flow 核心分支8.3 典型工作流新需求8.4 紧急修复流程9. .gitignore 与别名配置9.1 忽略特殊文件9.2 命令别名1. 安装与初次配置1.1 各平台安装平台安装方式CentOS/RHELsudo yum install -y gitUbuntu/Debiansudo apt-get install -y gitWindows下载 Git for Windows一路默认即可macOSbrew install git或从官网下载安装后验证git --version1.2 初次配置用户名和邮箱Git 会记录每次提交的作者信息必须用户名和邮箱与远程仓库账号一致# 全局配置推荐 git config --global user.name Your Name git config --global user.email your_emailexample.com # 查看所有配置 git config -l # 删除配置 git config --global --unset user.name命令作用范围写入位置git config --system整台机器所有用户系统级配置文件git config --global当前用户所有仓库~/.gitconfiggit config或git config --local当前仓库当前仓库的.git/config2. 工作区、暂存区、版本库物理层面硬盘上工作区就是你在电脑上写代码或文件的目录你直接新建、修改、删除文件都是在工作区操作暂存区英文叫 stage 或 index一般存放在 .git 目录下的 index 文件中即 .git/index所以暂存区有时也叫作索引index版本库又叫仓库英文名 repository工作区里有一个隐藏目录 .git它不算工作区而是 Git 的版本库版本库里的所有文件都可以被 Git 管理起来每个文件的修改、删除Git 都能跟踪以便随时追踪历史或在将来某个时刻“还原”通过新建或粘贴进目录的文件不能称之为向仓库中新增文件这只是在工作区新增了文件必须通过git add、git commit 才能把文件添加到仓库中并进行管理逻辑概念层面三者平级工作区 (Working Directory) │ │ git add ▼ 暂存区 (Staging Area / Index) → .git/index │ │ git commit ▼ 版本库 (Repository) → .git/objects, refs/heads/master.git 文件路径类型功能说明.git/branches目录旧版分支目录早期 Git 使用现在基本废弃通常为空可忽略.git/COMMIT_EDITMSG文件最近一次提交信息提交时编辑器保存的提交说明提交成功后也会保留.git/config文件仓库级配置git config --local写入这里如 remote、branch、core 配置.git/description文件仓库描述主要给 GitWeb 使用普通开发基本不用.git/HEAD文件当前分支指针通常内容是ref: refs/heads/master表示当前在 master 分支.git/hooks目录钩子脚本存放 commit、push、merge 等前后触发的脚本.git/index文件暂存区二进制文件记录git add后的文件、权限、blob 哈希等.git/info目录仓库附加信息常见有exclude文件.git/info/exclude文件本地忽略规则类似.gitignore但不会提交只对本仓库生效.git/logs目录引用日志 reflog记录 HEAD、分支等引用移动历史.git/objects目录Git 对象数据库存放 blob、tree、commit、tag 对象是 Git 的核心.git/refs目录引用目录存放分支、标签等引用.git/refs/heads目录本地分支引用如master、main、dev.git/refs/heads/master文件master 分支引用内容是 master 最新一次 commit 的哈希.git/refs/tags目录标签引用存放轻量标签或附注标签通常为空或包含标签文件objectsGit 对象库objects 是 Git 的对象库里面包含commit 对象、tree 对象、blob 对象对象存储内容指向谁含文件名含目录结构blob文件的实际内容二进制或文本不指向其他对象否否tree目录下的条目权限、类型、哈希、文件名指向 blob 或子 tree是是commit一个 tree 哈希、父 commit 哈希、作者、提交者、提交信息指向一个 tree零个或多个 parent commit否间接包含commit 801c22f... └── tree 983968... ├── blob e69de29... file1 ├── blob e69de29... file2 ├── blob e69de29... file3 └── blob 8d0e41... readme - hello git关系说明commit → tree每个 commit 指向一个 tree表示这次提交的项目目录快照tree → blobtree 中的普通文件条目指向 blobtree → treetree 中的子目录条目指向另一个 treecommit → parent commitcommit 指向父提交形成提交历史branch → commit分支引用如refs/heads/master指向最新 commit执行 git add 时暂存区的目录树被更新工作区修改或新增的文件内容被写入对象库中的一个新对象这些对象位于 .git/objects 目录下查找对象规则将 commit id 分成两部分前 2 位是文件夹名称后 38 位是文件名称git cat-file 用法git cat-file 是 Git 的底层对象查看命令用来查看 .git/objects 里的对象blob、tree、commit、tag 的类型、大小、内容和是否存在语法作用git cat-file -t 对象查看对象类型git cat-file -s 对象查看对象大小git cat-file -e 对象检查对象是否存在不输出只看退出码git cat-file -p 对象按对象类型美化输出内容git cat-file 类型 对象按指定类型输出原始内容git cat-file --batch批量读取对象并输出内容git cat-file --batch-check批量读取对象只输出哈希、类型、大小3. 基本操作3.1 初始化仓库与首次提交# 在项目目录下初始化形成 .git 隐藏文件夹 git init # 添加文件到暂存区 git add README.md # 单个文件 git add . # 所有变更 # 提交到版本库必须带 -m 说明 git commit -m first commitgit add 常用用法命令作用git add [file1] [file2] ...添加一个或多个文件到暂存区git add [dir]添加指定目录到暂存区包括子目录git add .添加当前目录下所有文件改动到暂存区git commit 常用用法命令作用git commit -m message提交暂存区全部内容到本地仓库git commit [file1] [file2] ... -m message提交暂存区中指定文件到仓库区-m 后面的 message 是提交说明提交说明不能省略提交说明要好好描述用来记录本次提交细节是给人看的3.2 查看状态与差异git status 常用命令git status 是 Git 中最常用的只读命令之一它不会修改仓库只告诉你 当前分支、暂存区、工作区、未跟踪/忽略文件、与上游分支的领先/落后情况场景推荐命令日常快速检查git status -sb提交前看差异git status -v脚本解析状态git status --porcelain查看忽略文件git status --ignored只看已跟踪文件git status -uno查看所有未跟踪文件git status -uall查看某目录状态git status -- src/查看某文件状态git status -- a.txt大仓库快速查看git status -sb --no-ahead-behindgit diff 常用命令git diff 的核心是比较两个状态。默认比较的是工作区 vs 暂存区也就是“已修改但还没 git add 的内容”最常用命令用途git diff看未暂存修改git diff --cached看已暂存修改git diff HEAD看全部未提交修改git diff A B比较两个提交git diff main...feature看分支相对分叉点的差异git diff --stat看变更统计git diff --check提交前检查空白和冲突标记git diff -w忽略空白比较git diff --color-words词级差异3.3 查看提交历史git log 常用用法命令作用说明git log查看完整提交历史默认显示哈希、作者、日期、提交说明git log --oneline一行显示短哈希 提交说明git log --oneline --graph --decorate --all图形化查看所有分支最推荐能看分支合并关系git log -n 5只看最近 5 条-n可换成任意数量git log --oneline -n 10最近 10 条一行显示简洁常用git log --prettyoneline简洁一行完整哈希 提交说明命令哈希长度提交信息备注--prettyoneline完整哈希一行显示不加--abbrev-commit时哈希很长--prettyoneline --abbrev-commit缩写哈希一行显示等价于--oneline--oneline缩写哈希一行显示最常用简写commit id 是 Git 在每次提交时根据提交内容、作者、时间、父提交等信息通过 SHA-1 哈希算法生成的一串唯一的十六进制字符串通常为 40 位用来唯一标识某一次提交版本它不是 1、2、3 递增的数字不同提交、不同仓库的 commit id 一般都不一样实际使用中常取前几位简写例如 c3504bdgit reflog 常用命令git reflog 是 Git 的本地引用日志记录 HEAD、分支、远程跟踪分支等引用移动历史。它能找回 reset --hard、rebase、commit --amend 后看似丢失的提交关键只存在本地不随 clone/push 传输最常用命令用途git reflog查看 HEAD 操作记录git reflog --all --dateiso查看所有引用操作记录git reflog -n 20看最近 20 条git branch rescue hash从 reflog 找回丢失提交git reset --hard HEAD{1}恢复到上一次 HEAD 位置3.4 版本回退git resetgit reset 是回退的核心根据参数控制回退范围模式移动 HEAD/分支重置暂存区重置工作区效果典型场景--soft是否否提交被撤销改动保留在暂存区撤销提交但想重新提交--mixed默认是是否提交被撤销改动保留在工作区但未暂存撤销提交并取消暂存--hard是是是提交和已跟踪改动全部丢弃彻底回退--merge是是部分更新更新 HEAD 与目标间不同的文件保留未暂存修改冲突则中止移动分支并保留本地修改--keep是是部分更新更新 HEAD 与目标间不同的文件保留本地修改冲突则中止比--hard安全地移动分支--hard 不会删除未跟踪文件。要删除未跟踪文件用 git clean -fd最常用命令用途git reset HEAD file取消暂存git reset --soft HEAD~1撤销提交保留暂存git reset HEAD~1撤销提交保留工作区git reset --hard HEAD~1彻底回退危险git reset commit -- file只重置文件索引git reset --keep commit安全移动分支并保留本地修改HEAD写法含义等价写法说明HEAD当前提交无当前所在位置的提交HEAD^1第一个父提交HEAD^最常用HEAD^2第二个父提交无只有合并提交才有HEAD^0当前提交本身HEAD少见HEAD^所有父提交无合并提交会有多个HEAD^ 等同于 HEAD^1数字 1 可以省略线性历史示例A --- B --- C (HEAD)表达式结果HEADCHEAD^1BHEAD^BHEAD~1BHEAD^1^1AHEAD~2AHEAD^2报错因为没有第二父在线性历史中 HEAD^1 HEAD~1 上一个提交合并提交示例A --- B --- M (HEAD, main) \ / CM是合并提交它有两个父表达式结果说明HEADM当前合并提交HEAD^1B第一父合并时所在分支的提交HEAD^2C第二父被合并进来的分支提交HEAD^B默认第一父HEAD~1B沿第一父向上 1 代HEAD~2A沿第一父继续向上HEAD^2^1A第二父的第一父HEAD^1 和 HEAD~1 的区别表达式含义普通提交合并提交HEAD^1第 1 个父提交上一个提交第一父HEAD^2第 2 个父提交不存在第二父HEAD~1沿第一父向上 1 代上一个提交第一父HEAD~2沿第一父向上 2 代上上个提交第一父的父HEAD^1^1第一父的第一父上上个提交第一父的父HEAD^2^1第二父的第一父不存在第二父的父^ 选父^1 第一父^2 第二父 ~ 沿第一父往上数~1 一代~2 两代3.5 撤销修改未提交/已暂存/已提交撤销修改本质上是放弃当前对文件做的改动让文件回到一个“安全”的历史快照状态场景指令工作区修改尚未addgit checkout -- file已add未commitgit reset HEAD file撤出暂存区再git checkout -- file已commit未 pushgit reset --hard HEAD^回退git checkout 常用命令最常用命令用途git checkout main切换分支git checkout -b new创建并切换git checkout -回上一个分支git checkout -- file丢弃工作区修改git checkout commit -- file从提交恢复文件git checkout --ours/--theirs file冲突选边git checkout -p交互式恢复3.6 删除文件# 误删恢复 git checkout -- file # 确定删除从工作区和版本库删除 git rm file git commit -m delete file4. 分支管理4.1 分支本质Git 的分支是一个指向提交对象的可变指针创建分支就是新建一个指针切换分支就是移动 HEAD 到另一个指针master或 main是默认主分支HEAD 指向当前分支如 ref: refs/heads/devHEAD - refs/heads/master - 某个提交4.2 分支常用指令操作指令查看本地分支git branch查看远程分支git branch -r创建分支git branch branch_name新分支 B 指向 A 当前指向的那个提交而HEAD仍然指向 A创建切换并建立关联git checkout -b feature-2 origin/feature-2切换分支git checkout branch_name或git switch branch_name创建并切换git checkout -b branch_name合并分支到当前分支git merge branch_name删除分支已合并git branch -d branch_name强制删除未合并git branch -D branch_name4.3 合并模式Fast-forward vs 普通合并Fast-forward快进当前分支是目标分支的直接上游直接将指针前移不产生新 commit优点简单缺点丢失分支历史信息普通合并--no-ff强制生成一个新的 merge commit保留分支历史便于追溯git merge --no-ff -m merge dev dev4.4 合并冲突解决当两个分支修改同一文件同一区域时合并会冲突。Git 在文件中标记冲突区域 HEAD 当前分支内容 目标分支内容 dev HEAD 到 当前分支的内容 到 dev被合并分支 dev 的内容需要手动编辑保留正确内容并删除这些冲突标记手动编辑后git add file git commit -m resolve conflict4.5 Bug 分支与 stashgit stash用于临时保存当前未提交的修改让工作区变干净以便切换分支、拉取代码或处理紧急任务。之后可以再恢复场景正在 dev 上开发新功能但 master 有紧急 bug 需修复而工作区未完成无法提交# 保存当前工作现场 git stash # 切回 master创建 fix_bug 分支修复 git checkout master git checkout -b fix_bug # ... 修复并提交 ... git checkout master git merge --no-ff fix_bug # 切回 dev恢复现场 git checkout dev git stash pop # 恢复并删除 stash # 或 git stash apply git stash drop最常用命令用途git stash push -u -m wip保存修改含新文件git stash list查看所有 stashgit stash show -p查看最新 stash 内容git stash pop恢复并删除最新 stashgit stash apply --index恢复并保留暂存状态git stash branch branch从 stash 创建分支git stash drop stash{n}删除指定 stashgit stash clear清空所有 stash慎用git stash push -u -m wip before pull git switch main git pull git switch - git stash pop5. 远程操作分布式协作5.1 远程仓库概念origin默认远程仓库别名clone 后Git 会自动把本地 master 和远程 master 关联起来分布式意味着每个本地仓库都是完整副本远程服务器仅用于交换更新协议支持 HTTPS 和 SSHSSH 需配置公钥免密推送5.2 SSH 公钥配置以 Gitee 为例# 生成密钥对 ssh-keygen -t rsa -C your_emailexample.com # 查看公钥并复制到 Gitee 个人设置 - SSH 公钥 cat ~/.ssh/id_rsa.pub5.3 克隆、推送与拉取操作指令克隆远程仓库git clone url查看远程信息git remote -v推送本地分支到远程git push origin local_branch:remote_branch同名可省略冒号后拉取远程更新并合并git pull origin remote_branch:branch如若是当前分支则可省略相当于 fetch merge设置上游分支git branch --set-upstream-toorigin/main feature-2只获取远程更新不合并git fetch origin命令作用git pull origin main现在拉origin/main并合到当前分支git branch --set-upstream-toorigin/main feature-2设置feature-2以后默认跟踪origin/maingit push -u origin feature-2推送并设置上游最常用对比维度git fetch origingit pull origin branch修改工作区代码绝不修改会修改合并成功后更新工作区修改本地分支指针仅更新远程追踪指针origin/xx更新本地当前分支的指针如main产生合并冲突永远不会可能会若远程改动与本地区改动重叠适用场景想先看看队友推了什么再决定怎么处理确信没有冲突或急于同步最新代码如果推送失败远程有新提交先 git pull 合并或解决冲突后再推送5.4 远程分支管理# 查看远程分支 git branch -r # 创建本地分支跟踪远程分支 git checkout -b dev origin/dev # 删除远程分支本地删除后 push git push origin --delete dev # 或推送空引用git push origin :dev6. 标签管理标签用于给特定提交打上易记的名称如 v1.0常用于版本发布6.1 创建标签# 给当前 commit 打标签 git tag v1.0 # 给指定 commit 打标签 git tag v0.9 commit_id # 带注释的标签推荐 git tag -a v1.0 -m release version 1.06.2 查看与推送标签git tag # 列出所有标签 git show v1.0 # 查看标签详情 # 推送单个标签到远程 git push origin v1.0 # 推送所有标签 git push origin --tags6.3 删除标签# 本地删除 git tag -d v1.0 # 远程删除 git push origin :refs/tags/v1.07. 多人协作实战同一分支 多分支7.1 同一分支协作如 dev多人同时修改同一分支会出现冲突标准流程git pull origin dev拉取最新本地修改并 git add / commitgit push origin dev若 push 失败远程已更新再 git pull解决冲突重新 commit再 push7.2 多分支协作feature 分支每个人的功能在自己的 feature 分支开发互不干扰创建并推送 feature 分支git checkout -b feature-login # ... 开发 ... git push origin feature-login另一人需要协助该分支git pull git checkout -b feature-login origin/feature-login # 继续开发并推送功能完成后合并到 develop或 master并删除 feature 分支7.3 清理远程已删除的本地跟踪分支git remote prune origin # 清理本地 stale 的远程引用8. Git Flow 及变体8.1 常用环境与分支对应关系分支名称分支说明适用环境master主分支生产环境release预发布分支预发布/测试环境develop开发分支开发环境feature需求开发分支本地hotfix紧急修复分支本地8.2 Git Flow 核心分支master生产就绪代码只合并 release 或 hotfixdevelop开发主线包含所有已完成功能feature/*新功能分支基于 develop完成后合并回 developrelease/*预发布分支基于 develop测试通过后合并到 master 和 develophotfix/*紧急修复分支基于 master修复后合并到 master 和 develop8.3 典型工作流新需求基于develop 创建 feature/order_20260922 分支feature/order_20260922 开发完成 → 提交 PR/MR代码审查 → 合并到 develop基于develop 创建 release/v1.2 分支部署到测试环境测试通过 → 合并 release/v1.2 到 master并打标签 v1.2同时将 master 合并回 develop确保同步删除 feature 和 release 分支8.4 紧急修复流程基于master 创建 hotfix/critical-bug 分支开始修复修复后部署到预发布验证确认修复有效合并到 master并打补丁标签例如 v1.2.1让生产环境上线合并到 develop防止后续版本丢失这次修复删除 hotfix/critical-bug 分支清理临时分支实际中很多团队简化 Git Flow采用 GitHub Flow只有 master feature或 GitLab Flow增加环境分支核心原则是 master 稳定、分支清晰、合并前审查9. .gitignore 与别名配置检验 .gitignore 的标准就是 git status 命令是不是说 working tree clean 。9.1 忽略特殊文件在根目录创建 .gitignore写入要忽略的模式# 忽略所有 .so 和 .ini *.so *.ini # 不忽略特定文件 !important.ini常用命令# 强制添加被忽略的文件 git add -f file # 检查哪个规则忽略了文件 git check-ignore -v file9.2 命令别名简化长命令git config --global alias.st status git config --global alias.last log -1 git config --global alias.co checkout