Git 使用指南
本文档记录了从零开始使用Git和GitHub的完整工作流程
📋 目录
常用Git指令速查
🔧 初始化与配置
# 初始化Git仓库
git init
# 作用:在当前目录创建.git文件夹,开始版本控制
# 查看Git配置
git config --list
# 作用:查看用户名、邮箱等配置信息
# 添加远程仓库
git remote add origin https://github.com/用户名/仓库名.git
# 作用:将本地仓库连接到GitHub远程仓库,origin是远程仓库的别名
# 查看远程仓库
git remote -v
# 作用:显示所有远程仓库的URL地址
📦 基础操作(日常最常用)
# 查看当前状态
git status
# 作用:显示工作区和暂存区的文件状态(修改、新增、删除等)
# 添加文件到暂存区
git add . # 添加所有文件
git add 文件名.txt # 添加指定文件
# 作用:将修改的文件放入暂存区,准备提交
# 提交到本地仓库
git commit -m "提交说明"
# 作用:将暂存区的内容永久保存到本地仓库,创建一个版本快照
# 查看提交历史
git log # 详细历史
git log --oneline # 简洁的单行显示
git log --oneline --graph --all # 带分支图的完整历史
# 作用:查看所有提交记录和版本历史
🌐 与GitHub同步
# 推送到远程仓库
git push # 推送当前分支(首次需要用下面的命令)
git push -u origin main # 首次推送,建立跟踪关系
git push origin 分支名 # 推送指定分支
# 作用:将本地提交上传到GitHub
# 从远程拉取更新
git pull # 拉取当前分支的更新
git pull origin main # 拉取指定分支
# 作用:从GitHub下载最新代码并合并到本地
# 获取远程更新(不合并)
git fetch
# 作用:下载远程更新但不自动合并,可以先查看再决定是否合并
# 清理远程分支引用
git fetch --prune
git remote prune origin
# 作用:删除本地对已不存在的远程分支的引用
🌿 分支管理
# 查看分支
git branch # 查看本地分支
git branch -a # 查看所有分支(包括远程)
# 作用:列出所有分支,*标记当前所在分支
# 创建并切换到新分支
git checkout -b feature/新功能
# 作用:创建一个新分支并立即切换过去(相当于下面两条命令)
# git branch feature/新功能 # 创建分支
# git checkout feature/新功能 # 切换分支
# 切换分支
git checkout main
# 作用:切换到指定分支
# 合并分支
git merge 分支名
# 作用:将指定分支的内容合并到当前分支
# 删除分支
git branch -d 分支名 # 删除已合并的分支(安全)
git branch -D 分支名 # 强制删除(危险,会丢失未合并的代码)
# 作用:删除本地分支
🔍 查看与比较
# 查看文件差异
git diff # 查看工作区与暂存区的差异
git diff HEAD # 查看工作区与最新提交的差异
git diff 分支1 分支2 # 比较两个分支的差异
# 作用:对比代码变化
# 查看文件列表
ls # 查看当前目录文件
ls -la # 查看所有文件(包括隐藏文件)
# 作用:确认文件是否存在
🛡️ 安全与保护
# 创建.gitignore文件
# 作用:指定哪些文件不被Git跟踪(如密码配置、临时文件)
# 示例内容:
# config.py # 忽略包含密码的配置文件
# __pycache__/ # 忽略Python缓存
# *.log # 忽略所有日志文件
# .env # 忽略环境变量文件
Git备份的核心思想
💡 三个关键理解
1. 版本快照,而非差异备份
传统备份:
项目v1.zip
项目v2_修改配置.zip
项目v3_添加功能.zip
↓ 问题:文件名混乱,难以管理
Git方式:
每次commit = 完整的项目快照
c0ede34 "初始版本"
aeb42b6 "添加README"
a44d9ce "合并新功能"
↓ 优势:每个版本都有唯一ID,可以精确回退
核心思想:Git不是"保存修改",而是"保存完整状态"。每个commit都是整个项目某个时刻的完整镜像。
2. 三个工作区的流转
工作区 暂存区 本地仓库 远程仓库
(Working Dir) (Staging Area) (Local Repo) (Remote Repo)
| | | |
修改文件 准备提交的文件 永久保存的版本 云端备份
| | | |
| git add → | | |
| | git commit → | |
| | | git push → |
| | | |
| ← git checkout | ← git reset | ← git pull |
核心思想:
- 工作区 → 你自由修改,随时可以撤销
- 暂存区 → 精心挑选要提交的内容(可以部分提交)
- 本地仓库 → 本地的完整历史备份
- 远程仓库 → 云端的安全备份
为什么需要暂存区? 它让你可以精确控制每次提交的内容,而不是"全部提交"或"全不提交"。
3. 分支隔离的安全网
main分支(生产环境,永远稳定)
|
c0ede34 ───────→ 保持稳定
|
└─→ feature/新功能(实验环境)
|
aeb42b6 → 开发中
|
测试通过?
├─ ✅ 是 → 合并回main
└─ ❌ 否 → 删除分支,main不受影响
核心思想:
- main分支 = 随时可以发布的代码
- 功能分支 = 安全的实验空间
- 失败了? 删除分支重来,main完全不受影响
- 成功了? 合并回main,成为正式版本
这就像"平行宇宙":在分支上做实验,失败了就销毁这个宇宙,成功了就把结果带回主世界。
🎯 备份的核心流程
日常工作流:
1. 修改代码(工作区)
2. git add(选择要保存的修改)
3. git commit(本地备份)
4. git push(云端备份)
功能开发流:
1. git checkout -b feature/xxx(创建功能分支)
2. 开发 → add → commit(在分支上工作)
3. git push origin feature/xxx(备份功能分支)
4. 在GitHub创建PR → 审查 → 合并到main
5. git pull(本地main同步云端)
6. 删除功能分支(清理)
紧急回退:
git log # 找到要回退的版本ID
git checkout 版本ID # 查看旧版本
git checkout -b hotfix/回退 # 如果需要,基于旧版本创建分支
如何培养使用习惯
📅 建立工作节奏
每天开始工作前
git status # 检查工作区状态
git pull # 拉取最新代码
git checkout -b feature/今天的任务 # 创建功能分支
习惯培养:把这三条命令做成脚本 start-work.sh,每天运行一次。
开发过程中(每15-30分钟)
git add .
git commit -m "阶段性成果:完成了xxx功能的yyy部分"
核心原则:小步快跑,频繁提交
- ✅ 好习惯:每完成一个小功能就提交(如"完成登录表单验证")
- ❌ 坏习惯:一天结束才提交一次(如"今天的修改")
为什么?
- 提交细粒度 → 回退精确(回退到15分钟前,而不是一天前)
- 提交频繁 → 不怕丢失工作
- 提交消息清晰 → 日后容易查找
每天结束工作时
git status # 确认没有未提交的修改
git push # 备份到GitHub
睡前必做:确保代码已经push到云端,否则电脑坏了就全丢了。
🔄 提交消息的规范
坏习惯:
git commit -m "修改"
git commit -m "更新"
git commit -m "bug修复"
git commit -m "1223"
好习惯:使用约定式提交(Conventional Commits)
git commit -m "feat: 添加用户登录功能"
git commit -m "fix: 修复邮件下载时的编码错误"
git commit -m "docs: 更新README安装说明"
git commit -m "refactor: 重构配置文件加载逻辑"
git commit -m "test: 添加PDF合并功能的单元测试"
类型前缀:
feat:新功能fix:修复Bugdocs:文档修改style:代码格式(不影响功能)refactor:重构(不是新功能也不是修复)test:测试相关chore:构建工具、依赖更新
为什么要规范?
- 一眼看出提交做了什么
- 方便搜索(
git log --grep="feat:") - 可以自动生成变更日志
🎯 具体的习惯培养策略
第1周:建立基础肌肉记忆
目标:让 git status → git add → git commit → git push 成为条件反射
练习方法:
- 每天工作时,设置番茄钟(25分钟)
- 每个番茄钟结束后,强制执行一次完整流程
- 不管代码改了多少,都要走一遍流程
预期效果:一周后,不用思考就能敲出这些命令
第2周:引入分支工作流
目标:养成"新功能 = 新分支"的思维模式
练习方法:
- 每天开始前必须创建功能分支
- 不允许在main分支上直接修改
- 每天结束前必须创建PR并合并
预期效果:两周后,你会觉得"直接在main上改"很不自然
第3周:优化提交质量
目标:写出清晰有用的提交消息
练习方法:
- 每次提交前,停下来想5秒:“我做了什么?”
- 用一句话总结(不超过50字符)
- 使用类型前缀(
feat:、fix:等)
预期效果:三周后,git log读起来像项目的故事书
第4周:形成个人工作流
目标:建立自己的最佳实践
练习方法:
- 把常用命令做成脚本或别名
- 设定自己的提交频率(如每小时一次)
- 建立代码审查checklist
预期效果:Git成为工作的一部分,而不是额外负担
💡 小技巧与提醒
提示1:使用Git别名加速
# 在 ~/.gitconfig 中添加:
[alias]
st = status
co = checkout
br = branch
ci = commit
pl = pull
ps = push
lg = log --oneline --graph --all
# 使用:
git st # 等同于 git status
git lg # 漂亮的历史图
提示2:定期清理分支
# 每周五执行一次(清理工作周产生的临时分支)
git branch --merged main | grep -v "main" | xargs git branch -d
提示3:设置提交模板
# 创建 ~/.gitmessage 文件:
# 类型(范围): 简短描述
#
# 详细说明(可选)
#
# 相关Issue: #123
# 配置Git使用这个模板:
git config --global commit.template ~/.gitmessage
以后每次 git commit 会自动打开编辑器,里面已经有这个模板。
提示4:关键时刻的救命命令
# 误删文件还没commit?
git checkout -- 文件名
# commit了错误代码?
git reset --soft HEAD~1 # 撤销最后一次commit,代码保留
# 想回到3天前?
git reflog # 查看所有操作历史
git reset --hard 版本ID # 回退到指定版本
# push了敏感信息?
# ⚠️ 立即联系有权限的人,可能需要重写历史或删除仓库重建
🎓 进阶学习路线
阶段1:基础掌握(1-2周)
- ✅ 你已完成:基础命令 + 分支 + GitHub同步
阶段2:团队协作(2-4周)
- Issues管理
- Code Review实践
- 冲突解决(Merge Conflicts)
- Rebase vs Merge的选择
阶段3:高级技巧(1-2个月)
- Git Hooks(自动化检查)
- Submodules(子模块管理)
- Cherry-pick(精确移植提交)
- Bisect(二分法找Bug)
阶段4:团队规范(持续)
- 制定团队Git规范
- CI/CD集成
- 分支策略(Git Flow、GitHub Flow)
- 语义化版本管理
📚 资源推荐
官方文档
- Git官方文档:https://git-scm.com/doc
- GitHub文档:https://docs.github.com
可视化工具
- GitHub Desktop:图形界面的Git工具
- GitKraken:跨平台Git客户端
- VS Code:内置优秀的Git集成
学习资源
- 《Pro Git》(免费电子书):https://git-scm.com/book/zh/v2
- Learn Git Branching(交互式学习):https://learngitbranching.js.org/?locale=zh_CN
✅ 检查清单
每天工作前
-
git status- 检查状态 -
git pull- 同步最新代码 -
git checkout -b feature/xxx- 创建功能分支
开发过程中
- 每15-30分钟提交一次
- 提交消息使用类型前缀
- 随时
git status确认状态
每天工作后
-
git push- 备份到云端 - 如果功能完成,创建PR
- 清理已合并的本地分支
每周复盘
- 检查是否有未push的提交
- 清理合并后的功能分支
- 回顾提交历史,总结工作进度
记住:Git是工具,不是负担。养成习惯后,它会成为你最可靠的时光机和安全网!🚀