Git 使用指南

本文档记录了从零开始使用Git和GitHub的完整工作流程


📋 目录

  1. 常用Git指令速查
  2. Git备份的核心思想
  3. 如何培养使用习惯

常用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: 修复Bug
  • docs: 文档修改
  • style: 代码格式(不影响功能)
  • refactor: 重构(不是新功能也不是修复)
  • test: 测试相关
  • chore: 构建工具、依赖更新

为什么要规范?

  • 一眼看出提交做了什么
  • 方便搜索(git log --grep="feat:"
  • 可以自动生成变更日志

🎯 具体的习惯培养策略

第1周:建立基础肌肉记忆

目标:让 git statusgit addgit commitgit 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是工具,不是负担。养成习惯后,它会成为你最可靠的时光机和安全网!🚀