Git 工作流程
本章将深入介绍 Git 的工作流程,帮助你理解 Git 是如何管理文件版本的,以及不同操作在整个流程中的作用。
Git 工作流程概览
Git 的工作流程可以简化为以下几个步骤:
1. 修改文件 (Working Directory)
2. 暂存修改 (git add → Staging Area)
3. 提交修改 (git commit → Repository)
4. 推送到远程 (git push → Remote Repository)详细工作流程图
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Working │ │ Staging │ │ Local │ │ Remote │
│ Directory │ │ Area │ │ Repository │ │ Repository │
│ (工作区) │ │ (暂存区) │ │ (本地仓库) │ │ (远程仓库) │
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │ │
│ git add │ │ │
├──────────────────────→│ │ │
│ │ git commit │ │
│ ├──────────────────────→│ │
│ │ │ git push │
│ │ ├──────────────────────→│
│ │ │ │
│ git checkout │ │ git pull/fetch │
←──────────────────────────────────────────────────────────────────────┤
│ │ │ │四个工作区域详解
1. 工作区 (Working Directory)
定义:你实际编辑文件的地方,就是你在文件管理器中看到的项目文件夹。
特点:
- 包含项目的实际文件
- 可以自由编辑、创建、删除文件
- Git 会监控这个区域的文件变化
示例操作:
bash
# 在工作区创建文件
echo "Hello World" > hello.txt
# 编辑文件
vim hello.txt
# 查看工作区状态
git status2. 暂存区 (Staging Area/Index)
定义:一个临时区域,用来存放即将提交的文件快照。
特点:
- 是工作区和仓库之间的缓冲区
- 可以选择性地添加文件修改
- 允许精确控制每次提交的内容
示例操作:
bash
# 添加文件到暂存区
git add hello.txt
# 添加所有修改的文件
git add .
# 查看暂存区内容
git status
# 从暂存区移除文件(但保留工作区修改)
git restore --staged hello.txt3. 本地仓库 (Local Repository)
定义:存储项目完整历史记录的地方,位于 .git 文件夹中。
特点:
- 包含所有提交的完整历史
- 存储分支和标签信息
- 完全离线工作
示例操作:
bash
# 提交暂存区内容到本地仓库
git commit -m "添加 hello.txt 文件"
# 查看本地仓库历史
git log
# 查看分支
git branch4. 远程仓库 (Remote Repository)
定义:托管在网络上的仓库副本,用于团队协作。
特点:
- 通常托管在 GitHub、GitLab 等平台
- 多人可以访问和协作
- 作为项目的"权威"版本
示例操作:
bash
# 添加远程仓库
git remote add origin https://github.com/username/repo.git
# 推送到远程仓库
git push origin main
# 从远程仓库拉取更新
git pull origin main典型工作流程示例
让我们通过一个完整的例子来演示 Git 工作流程:
场景:开发一个新功能
1. 准备工作
bash
# 创建新项目
mkdir git-workflow-demo
cd git-workflow-demo
git init
# 配置(如果还没有全局配置)
git config user.name "张三"
git config user.email "zhangsan@example.com"2. 创建初始文件
bash
# 在工作区创建文件
cat > app.py << EOF
#!/usr/bin/env python3
def main():
print("欢迎使用我们的应用!")
if __name__ == "__main__":
main()
EOF
# 查看状态 - 文件在工作区,未被跟踪
git status输出:
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
app.py
nothing added to commit but untracked files present (use "git add" to track)3. 添加到暂存区
bash
# 添加文件到暂存区
git add app.py
# 查看状态 - 文件现在在暂存区
git status输出:
On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: app.py4. 提交到本地仓库
bash
# 提交到本地仓库
git commit -m "初始提交:添加基本应用结构"
# 查看状态 - 工作区干净
git status输出:
On branch main
nothing to commit, working tree clean5. 开发新功能
bash
# 修改文件(在工作区)
cat >> app.py << EOF
def greet_user(name):
return f"你好, {name}!"
def get_user_name():
return input("请输入你的名字: ")
EOF
# 查看修改
git diff6. 分阶段提交
bash
# 先提交一部分修改
git add app.py
git commit -m "添加用户问候功能"
# 继续修改
sed -i 's/print("欢迎使用我们的应用!")/name = get_user_name(); print(greet_user(name))/' app.py
# 提交新的修改
git add app.py
git commit -m "集成用户问候功能到主程序"7. 推送到远程仓库
bash
# 添加远程仓库(假设已在 GitHub 创建)
git remote add origin https://github.com/username/git-workflow-demo.git
# 推送到远程
git push -u origin main文件状态生命周期
Git 中的文件有四种状态:
Untracked ──git add──→ Staged ──git commit──→ Committed
↑ │ │
│ │ │
└──git rm──────────────┘ │
│
Modified ←──edit file──────────────────────────────┘
│
└──git add──→ Staged文件状态详解
Untracked(未跟踪)
- 新创建的文件
- Git 不会自动跟踪
- 需要
git add来开始跟踪
Staged(已暂存)
- 已添加到暂存区的文件
- 准备在下次提交中包含
- 可以用
git restore --staged取消暂存
Committed(已提交)
- 已保存到本地仓库的文件
- 成为项目历史的一部分
- 可以安全地修改或删除
Modified(已修改)
- 已跟踪但在工作区被修改的文件
- 需要重新添加到暂存区才能提交
查看文件状态
bash
# 查看详细状态
git status
# 查看简洁状态
git status -s
# 输出示例:
# M modified_file.txt # 已修改并暂存
# M modified_file2.txt # 已修改但未暂存
# A new_file.txt # 新文件已暂存
# ?? untracked_file.txt # 未跟踪文件常见工作流程模式
1. 基本个人开发流程
bash
# 1. 修改文件
vim file.txt
# 2. 查看修改
git diff
# 3. 添加到暂存区
git add file.txt
# 4. 提交
git commit -m "描述修改内容"
# 5. 推送(如果有远程仓库)
git push2. 功能分支开发流程
bash
# 1. 创建功能分支
git checkout -b feature/new-feature
# 2. 开发功能
# ... 编辑文件 ...
git add .
git commit -m "实现新功能的第一部分"
# 3. 继续开发
# ... 更多修改 ...
git add .
git commit -m "完成新功能"
# 4. 切换回主分支
git checkout main
# 5. 合并功能分支
git merge feature/new-feature
# 6. 删除功能分支
git branch -d feature/new-feature
# 7. 推送更新
git push3. 协作开发流程
bash
# 1. 获取最新代码
git pull origin main
# 2. 创建功能分支
git checkout -b feature/my-feature
# 3. 开发并提交
git add .
git commit -m "实现我的功能"
# 4. 推送分支
git push origin feature/my-feature
# 5. 创建 Pull Request(在 GitHub 等平台)
# 6. 代码审查和合并(由维护者完成)
# 7. 清理本地分支
git checkout main
git pull origin main
git branch -d feature/my-feature工作流程最佳实践
1. 提交频率
bash
# ✅ 好的做法:频繁的小提交
git commit -m "添加用户验证函数"
git commit -m "修复登录页面样式问题"
git commit -m "更新用户文档"
# ❌ 避免:一个巨大的提交
git commit -m "完成整个用户系统"2. 提交信息规范
bash
# ✅ 好的提交信息
git commit -m "feat: 添加用户登录功能"
git commit -m "fix: 修复密码验证错误"
git commit -m "docs: 更新 API 文档"
# ❌ 不好的提交信息
git commit -m "修改"
git commit -m "更新代码"
git commit -m "bug fix"3. 暂存区的使用
bash
# ✅ 选择性暂存
git add specific_file.py # 只添加特定文件
git add -p # 交互式添加部分修改
# ✅ 查看暂存内容
git diff --staged # 查看暂存区与上次提交的差异4. 工作区管理
bash
# ✅ 保持工作区整洁
git status # 经常检查状态
git clean -n # 预览要删除的未跟踪文件
git clean -f # 删除未跟踪文件
# ✅ 使用 .gitignore
echo "*.log" >> .gitignore
echo "node_modules/" >> .gitignore
git add .gitignore
git commit -m "添加 .gitignore 文件"工作流程故障排除
常见问题和解决方案
1. 忘记添加文件到暂存区
bash
# 问题:提交后发现遗漏了文件
git add forgotten_file.txt
git commit --amend --no-edit # 修改最后一次提交2. 提交信息写错了
bash
# 修改最后一次提交的信息
git commit --amend -m "正确的提交信息"3. 工作区有未保存的修改,需要切换分支
bash
# 方法1:暂存修改
git stash
git checkout other-branch
# 工作完成后
git checkout original-branch
git stash pop
# 方法2:提交临时修改
git add .
git commit -m "WIP: 临时保存工作进度"
# 稍后使用 git reset 或 git commit --amend 清理4. 误删了文件
bash
# 恢复已跟踪的文件
git restore deleted_file.txt
# 或使用旧语法
git checkout -- deleted_file.txt可视化工具
命令行可视化
bash
# 图形化显示分支历史
git log --graph --oneline --all
# 显示文件修改统计
git log --stat
# 显示每次提交的详细修改
git log -p图形化工具推荐
- GitKraken - 美观的跨平台客户端
- SourceTree - 免费的 Git 客户端
- GitHub Desktop - GitHub 官方客户端
- VS Code - 内置 Git 支持的编辑器
总结
Git 工作流程的核心是理解四个区域之间的关系:
- 工作区 →
git add→ 暂存区 - 暂存区 →
git commit→ 本地仓库 - 本地仓库 →
git push→ 远程仓库
掌握这个流程后,你就能:
- ✅ 有效管理代码版本
- ✅ 与团队成员协作
- ✅ 安全地实验新功能
- ✅ 追踪项目历史
在下一章中,我们将深入学习工作区、暂存区和版本库的具体概念和操作。