Skip to content

04 工作区域和文件状态 Git基本操作

1. Git 的工作区域

Git 的本地数据管理分为三个主要工作区域(若包含远程仓库,则为四个)。这些区域共同协作完成版本控制:

  1. 工作区(Working Directory)
  2. 定义:工作区是本地计算机上存放项目文件的地方,即你直接编辑代码或文件的实际目录。
  3. 作用:包含正在编辑的文件,文件状态为未跟踪(untracked)已修改(modified)
  4. 示例:项目文件夹 my-project/ 中的文件(如 index.htmlmain.py)。

  5. 暂存区(Staging Area 或 Index)

  6. 定义:暂存区是一个中间区域,存储准备提交到本地仓库的更改,位于 .git/index 文件中。
  7. 作用:缓存文件的修改,允许选择性地提交部分更改,文件状态为已暂存(staged)
  8. 示例:通过 git add 将修改的文件放入暂存区。

  9. 本地仓库(Local Repository)

  10. 定义:本地仓库存储项目的所有版本历史,位于 .git 目录(如 .git/objects)。
  11. 作用:保存已提交的版本快照,文件状态为已提交(committed)
  12. 示例:通过 git commit 将暂存区内容保存到本地仓库。

  13. 远程仓库(Remote Repository,可选)

  14. 定义:存储在远程服务器(如 GitHub、GitLab)的仓库。
  15. 作用:用于团队协作和代码备份,文件状态为已推送(pushed)
  16. 示例:通过 git push 将本地仓库内容上传到远程。

类比(参考): - 工作区:你的书桌,存放正在编辑的草稿。 - 暂存区:文件夹,存放准备整理的章节。 - 本地仓库:书架,存放完成的书稿。 - 远程仓库:云端图书馆,共享或备份书稿。


2. Git 的文件状态

Git 中的文件在不同工作区域具有不同状态,理解这些状态是掌握 Git 的核心。文件状态分为以下几种(基于):

  1. 未跟踪(Untracked)
  2. 文件刚创建,未被 Git 管理,位于工作区。
  3. 示例:新建 newfile.txt,未执行 git add

  4. 已修改(Modified)

  5. 文件已跟踪但被修改,尚未添加到暂存区,位于工作区。
  6. 示例:修改 index.html 的内容。

  7. 已暂存(Staged)

  8. 文件修改已通过 git add 添加到暂存区,准备提交。
  9. 示例:对 index.html 执行 git add index.html

  10. 已提交(Committed)

  11. 文件通过 git commit 保存到本地仓库,生成版本快照。
  12. 示例:执行 git commit -m "Update index.html"

  13. 已推送(Pushed,可选)

  14. 文件通过 git push 提交到远程仓库。
  15. 示例:执行 git push origin main

3. 工作区域与文件状态的转换流程

文件状态在工作区域之间通过 Git 命令转换,以下是典型流程(结合):

顺序操作

  1. 初始状态
  2. 工作区与仓库一致,文件状态为未修改(Origin)
  3. 示例:刚克隆仓库(git clone)后,运行 git status 显示:

    nothing to commit, working tree clean
    

  4. 文件增删改,变为已修改(Modified)或未跟踪(Untracked)

  5. 在工作区创建或修改文件。
  6. 示例:新建 newfile.txt 或修改 index.html,运行 git status

    Untracked files:
      newfile.txt
    Changes not staged for commit:
      modified: index.html
    

  7. 添加到暂存区,变为已暂存(Staged)

  8. 使用 git add 将修改移到暂存区:
    git add newfile.txt  # 添加单个文件
    git add .            # 添加所有更改
    
  9. 运行 git status

    Changes to be committed:
      new file: newfile.txt
      modified: index.html
    

  10. 提交到本地仓库,变为已提交(Committed)

  11. 使用 git commit 保存更改:
    git commit -m "Add newfile.txt and update index.html"
    
  12. 运行 git status

    nothing to commit, working tree clean
    

  13. 推送到远程仓库,变为已推送(Pushed)

  14. 使用 git push 上传:
    git push origin main
    

撤销操作

  1. 已修改但未暂存
  2. 查看修改:
    git diff  # 查看工作区与暂存区的差异
    git diff index.html  # 查看具体文件差异
    
  3. 撤销修改(恢复到上次提交状态):
    git checkout -- index.html  # 撤销单个文件修改
    git checkout -- .           # 撤销所有修改
    
  4. 撤销未跟踪文件:

    git clean -f   # 删除未跟踪文件
    git clean -df  # 删除未跟踪文件和文件夹
    

  5. 已暂存但未提交

  6. 查看暂存区差异:
    git diff --cached  # 查看暂存区与本地仓库的差异
    
  7. 撤销暂存(移回工作区):
    git reset index.html  # 撤销单个文件的暂存
    git reset             # 撤销所有暂存
    
  8. 撤销暂存并清空修改(谨慎):

    git reset --hard  # 清空暂存区和工作区
    

  9. 已提交但未推送

  10. 回退到上一个版本:
    git reset --hard HEAD^  # 回退并删除更改
    git reset --soft HEAD^  # 回退但保留更改到工作区
    
  11. 回退到指定版本(需提交的哈希值):

    git reset --hard <hash>  # 回退到指定提交
    

  12. 已推送

  13. 强制覆盖远程仓库(谨慎,需通知团队):
    git push -f origin main
    

4. 常用命令

以下是管理工作区域和文件状态的核心命令(参考): - git status:查看工作区和暂存区文件状态。 - git add <file>:将文件从工作区添加到暂存区。 - git commit -m "message":提交暂存区内容到本地仓库。 - git push:推送本地仓库到远程。 - git diff:查看工作区与暂存区的差异。 - git reset:撤销暂存或回退版本。 - git checkout -- <file>:撤销工作区修改。 - git clean -f:删除未跟踪文件。


5. 实际操作示例

以下是一个完整的工作流示例:

  1. 初始化仓库

    mkdir my-project
    cd my-project
    git init
    

  2. 创建文件并修改

    echo "# My Project" > README.md
    touch index.html
    git status  # 显示未跟踪文件:README.md, index.html
    

  3. 添加到暂存区

    git add .
    git status  # 显示已暂存:README.md, index.html
    

  4. 提交到本地仓库

    git commit -m "Initial commit with README and index.html"
    git status  # 显示工作区干净
    

  5. 关联远程仓库并推送

    git remote add origin https://github.com/username/my-project.git
    git push -u origin main
    

  6. 修改文件并撤销

  7. 修改 index.html 后:
    git status  # 显示已修改
    git checkout -- index.html  # 撤销修改
    

6. 最佳实践

  • 频繁检查状态:使用 git status 确认文件状态。
  • 小步提交:每次提交专注于单一功能,便于追踪。
  • 清晰提交信息:描述具体更改内容,如 “Add login page UI”。
  • 忽略无关文件:确保 .gitignore 包含临时文件和敏感信息。
  • 备份远程:定期推送至远程仓库,避免数据丢失。

7. 常见问题

  • “Untracked files”提示:新文件需用 git add 跟踪。
  • “Changes not staged”提示:修改未添加到暂存区,需 git add
  • 暂存区看不到修改:使用 git diff --cached 查看暂存区与本地仓库差异。
  • 误删文件:若已提交,可用 git checkout <hash> -- <file> 恢复。


git log 查看仓库提交历史记录 git log --oneline 查看简介的提交记录