Skip to content

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 status

2. 暂存区 (Staging Area/Index)

定义:一个临时区域,用来存放即将提交的文件快照。

特点

  • 是工作区和仓库之间的缓冲区
  • 可以选择性地添加文件修改
  • 允许精确控制每次提交的内容

示例操作

bash
# 添加文件到暂存区
git add hello.txt

# 添加所有修改的文件
git add .

# 查看暂存区内容
git status

# 从暂存区移除文件(但保留工作区修改)
git restore --staged hello.txt

3. 本地仓库 (Local Repository)

定义:存储项目完整历史记录的地方,位于 .git 文件夹中。

特点

  • 包含所有提交的完整历史
  • 存储分支和标签信息
  • 完全离线工作

示例操作

bash
# 提交暂存区内容到本地仓库
git commit -m "添加 hello.txt 文件"

# 查看本地仓库历史
git log

# 查看分支
git branch

4. 远程仓库 (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.py

4. 提交到本地仓库

bash
# 提交到本地仓库
git commit -m "初始提交:添加基本应用结构"

# 查看状态 - 工作区干净
git status

输出:

On branch main
nothing to commit, working tree clean

5. 开发新功能

bash
# 修改文件(在工作区)
cat >> app.py << EOF

def greet_user(name):
    return f"你好, {name}!"

def get_user_name():
    return input("请输入你的名字: ")
EOF

# 查看修改
git diff

6. 分阶段提交

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

文件状态详解

  1. Untracked(未跟踪)

    • 新创建的文件
    • Git 不会自动跟踪
    • 需要 git add 来开始跟踪
  2. Staged(已暂存)

    • 已添加到暂存区的文件
    • 准备在下次提交中包含
    • 可以用 git restore --staged 取消暂存
  3. Committed(已提交)

    • 已保存到本地仓库的文件
    • 成为项目历史的一部分
    • 可以安全地修改或删除
  4. 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 push

2. 功能分支开发流程

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 push

3. 协作开发流程

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

图形化工具推荐

  1. GitKraken - 美观的跨平台客户端
  2. SourceTree - 免费的 Git 客户端
  3. GitHub Desktop - GitHub 官方客户端
  4. VS Code - 内置 Git 支持的编辑器

总结

Git 工作流程的核心是理解四个区域之间的关系:

  1. 工作区git add暂存区
  2. 暂存区git commit本地仓库
  3. 本地仓库git push远程仓库

掌握这个流程后,你就能:

  • ✅ 有效管理代码版本
  • ✅ 与团队成员协作
  • ✅ 安全地实验新功能
  • ✅ 追踪项目历史

在下一章中,我们将深入学习工作区、暂存区和版本库的具体概念和操作。

本站内容仅供学习和研究使用。