一、Git 核心概念与基础配置
1. 核心概念表
| 术语 | 定义 | 位置 |
|---|---|---|
| 工作区(WD) | 本地可见的文件目录,日常编辑的文件存放处 | 项目根目录(非 .git 内) |
| 暂存区(SA) | 临时存储待提交的修改,可精确选择提交内容 | .git/index |
| 版本库(Repo) | 存储所有提交历史的数据库,每个提交是不可修改的快照 | .git 目录内 |
| 远程仓库 | 托管在服务器的仓库(如 GitHub),用于多人协作同步代码 | 远程服务器(如 GitHub) |
| 分支(Branch) | 独立的开发线,可并行开发不同功能,默认主分支为 main 或 master |
版本库内 |
2. 安装与初始化配置
-
安装验证:
git --version # 输出版本号表示安装成功,如 git version 2.45.1 -
全局配置(必做):
# 设置提交者信息(会显示在所有提交记录中) git config --global user.name "Your Full Name" git config --global user.email "your.email@example.com" # 配置默认编辑器(避免使用 Vim 时操作困难) git config --global core.editor "code --wait" # VS Code(需配置环境变量) git config --global core.editor "notepad.exe" # Windows 记事本 # 查看配置 git config --global --list # 列出所有全局配置 -
初始化仓库:
场景 命令 说明 本地新建仓库 git init在当前目录生成 .git文件夹克隆远程仓库 git clone <远程地址>从远程下载完整仓库(含历史记录) 克隆指定分支 git clone -b <分支名> <远程地址>仅克隆远程指定分支(节省时间)
二、工作区与暂存区操作
1. 文件状态表
| 状态符号 | 含义(通过 git status -s 查看) |
说明 |
|---|---|---|
?? |
未跟踪(Untracked) | 新文件,未执行 git add |
A |
已暂存(Staged) | 已执行 git add,待提交 |
M(红色) |
已修改(Modified) | 已跟踪文件被修改,未暂存 |
M(绿色) |
已修改且暂存(Modified+Staged) | 已执行 git add,修改后再次修改 |
D |
已删除(Deleted) | 已跟踪文件被删除,未暂存或已暂存 |
2. 核心操作命令
| 操作目标 | 命令 | 示例 |
|---|---|---|
| 查看文件状态 | git status |
git status(详细)/ git status -s(精简) |
| 查看具体修改内容 | git diff <文件名> |
git diff index.html(工作区 vs 暂存区) |
| 查看暂存区与版本库差异 | git diff --cached <文件名> |
git diff --cached style.css |
| 添加单个文件到暂存区 | git add <文件名> |
git add app.js |
| 添加目录到暂存区 | git add <目录名>/ |
git add src/ |
| 添加所有新增 / 修改文件 | git add . |
不包括已删除文件 |
| 添加修改 / 删除文件 | git add -u |
不包括新增文件 |
| 撤销工作区修改 | git checkout -- <文件名> |
git checkout -- app.js(恢复到最近版本) |
| 撤销暂存区修改(放回工作区) | git reset HEAD <文件名> |
git reset HEAD app.js |
三、版本库提交与历史查看
1. 提交操作
| 操作 | 命令 | 说明 |
|---|---|---|
| 提交暂存区到版本库 | git commit -m "提交说明" |
提交说明需简洁清晰(如 fix: 修复登录bug) |
| 提交时修改说明 | git commit --amend |
修改最近一次提交的说明(未推送到远程时使用) |
| 跳过暂存区直接提交 | git commit -am "提交说明" |
仅适用于已跟踪文件的修改 / 删除 |
2. 查看提交历史
| 需求 | 命令 | 说明 |
|---|---|---|
| 查看完整历史 | git log |
按时间倒序,含哈希值、作者、时间、说明 |
| 精简历史(一行一条) | git log --oneline |
显示哈希值前 7 位 + 提交说明 |
| 查看最近 n 条历史 | git log -n <数字> |
git log -n 3(最近 3 条) |
| 查看文件修改历史 | git log -p <文件名> |
git log -p app.js(含具体修改内容) |
| 图形化显示分支历史 | git log --graph --oneline |
用 * 显示分支合并关系 |
| 查看所有操作记录(含删除的提交) | git reflog |
用于找回误删的提交 |
四、版本回退与撤销(核心风险操作)
1. git reset 三种模式对比表
| 模式 | 版本库(HEAD) | 暂存区(Index) | 工作区(WD) | 适用场景 | 风险级别 |
|---|---|---|---|---|---|
--soft |
修改 | 不变 | 不变 | 撤销提交,保留暂存区修改(重新提交) | 低 |
--mixed |
修改 | 修改 | 不变 | 撤销提交和暂存,保留工作区修改(常用) | 中 |
--hard |
修改 | 修改 | 修改 | 彻底回退到历史版本(丢弃所有未提交修改) | 高 |
2. 回退命令示例
# 回退到上一版本(HEAD^ 等价于 HEAD~1)
git reset --mixed HEAD^ # 保留工作区,常用
git reset --hard HEAD~3 # 回退到前3个版本(慎用,会丢失修改)
# 通过哈希值回退(从 git log 或 git reflog 获取哈希)
git reset --hard a3f2d1c # 回退到哈希为 a3f2d1c 的版本
五、分支管理(多人协作核心)
1. 分支命名规范
| 分支类型 | 命名示例 | 用途 |
|---|---|---|
| 主分支 | main / master |
存放稳定代码,用于发布 |
| 开发分支 | develop |
团队日常开发的集成分支 |
| 功能分支 | feature/user-login |
开发新功能,完成后合并到 develop |
| 修复分支 | hotfix/payment-bug |
紧急修复线上问题,合并到 main 和 develop |
| 发布分支 | release/v1.0 |
版本发布前的准备(如改版本号) |
2. 分支操作命令表
| 操作 | 命令 | 示例 |
|---|---|---|
| 查看本地分支 | git branch |
* main 表示当前在 main 分支 |
| 查看远程分支 | git branch -r |
显示 origin/main 等远程分支 |
| 查看所有分支(本地 + 远程) | git branch -a |
远程分支以红色显示 |
| 创建分支(不切换) | git branch <分支名> |
git branch feature/cart |
| 创建并切换分支 | git checkout -b <分支名> |
git checkout -b hotfix/login |
| 切换分支(Git 2.23+) | git switch <分支名> |
git switch develop |
| 合并分支(目标分支:当前分支) | git merge <源分支名> |
git checkout main; git merge feature/pay |
| 删除本地已合并分支 | git branch -d <分支名> |
git branch -d feature/cart |
| 强制删除未合并分支 | git branch -D <分支名> |
git branch -D feature/old(慎用) |
3. 解决合并冲突
当两个分支修改同一文件的同一行时,会产生冲突,文件中会出现标记:
<<<<<<< HEAD(当前分支内容)
hello world
=======
hello git
>>>>>>> feature/change(源分支内容)
解决步骤:
- 打开冲突文件,删除冲突标记(
<<<<<<<、=======、>>>>>>>),保留需要的内容。 - 执行
git add <冲突文件>标记为已解决。 - 执行
git commit完成合并(无需-m,自动生成合并说明)。
六、远程仓库交互
1. 远程仓库操作命令表
| 操作 | 命令 | 示例 |
|---|---|---|
| 关联远程仓库 | git remote add <别名> <远程地址> |
git remote add origin https://github.com/xxx/repo.git |
| 查看远程仓库信息 | git remote -v |
显示 fetch(拉取)和 push(推送)地址 |
| 拉取远程分支并合并 | git pull <远程别名> <远程分支> |
git pull origin main |
| 首次推送分支(关联上游) | git push -u <远程别名> <本地分支> |
git push -u origin feature/login(后续可直接 git push) |
| 推送本地分支到远程 | git push <远程别名> <本地分支> |
git push origin develop |
| 删除远程分支 | git push <远程别名> --delete <远程分支> |
git push origin --delete feature/old |
七、进阶功能:Stash 与 Tag
1. 暂存工作区(Stash)
用于临时保存未提交的修改(如切换分支前):
| 操作 | 命令 | 说明 |
|---|---|---|
| 暂存当前工作区 | git stash |
暂存所有未提交的修改(新增文件需先 git add) |
| 查看暂存列表 | git stash list |
显示 stash@{0}: WIP on main: a3f2d1c 等记录 |
| 恢复最近的暂存并删除记录 | git stash pop |
常用,恢复后删除暂存 |
| 恢复指定暂存(不删除) | git stash apply stash@{1} |
数字为暂存索引(从 git stash list 获取) |
| 删除指定暂存 | git stash drop stash@{0} |
仅删除暂存记录,不恢复内容 |
2. 标签管理(Tag)
标记重要版本(如发布版本):
| 操作 | 命令 | 说明 |
|---|---|---|
| 创建轻量标签(仅关联提交) | git tag <标签名> |
git tag v1.0 |
| 创建带说明的标签 | git tag -a <标签名> -m "说明" |
git tag -a v1.0 -m "正式发布1.0版本" |
| 查看所有标签 | git tag |
按字母排序显示 |
| 推送单个标签到远程 | git push <远程别名> <标签名> |
git push origin v1.0 |
| 推送所有标签到远程 | git push <远程别名> --tags |
git push origin --tags |
| 删除本地标签 | git tag -d <标签名> |
git tag -d v1.0 |
| 删除远程标签 | git push <远程别名> --delete <标签名> |
git push origin --delete v1.0 |
八、.gitignore 配置(必学)
创建 .gitignore 文件,指定无需 Git 跟踪的文件 / 目录,示例:
# 忽略所有 .log 文件
*.log
# 忽略 node_modules 目录(前端依赖)
node_modules/
# 忽略 Python 虚拟环境
venv/
# 忽略 IDE 配置文件(VS Code)
.vscode/
# 例外:不忽略 important.log
!important.log
- 注意 :
.gitignore需提交到版本库,供团队共享;已跟踪的文件无法通过.gitignore忽略,需先执行git rm --cached <文件名>取消跟踪。
九、最佳实践总结
- 提交规范 :每次提交说明需清晰(如
feat: 新增购物车功能),避免大而全的提交。 - 分支策略:主分支仅用于合并,开发在功能分支进行,定期从主分支同步到功能分支。
- 推送前检查 :推送前先
git pull同步远程代码,解决冲突后再推送。 - 慎用强制操作 :
git reset --hard、git push -f会丢失历史,多人协作时禁止使用。 - 定期备份:重要版本用 Tag 标记,确保可回溯到稳定状态。