【Git 内部】日常 porcelain 命令改写了哪些文件

💡 原文中文,约2400字,阅读约需6分钟。
📝

内容提要

本文介绍了 Git 的基本命令及其对磁盘的影响,包括 `git add`、`git commit`、`git branch`、`git checkout` 和 `git reset` 的具体操作及其对 `.git` 目录的影响。通过实测,展示了每个命令如何更新对象库、索引和引用,帮助理解 Git 的内部结构和工作原理。

🎯

关键要点

  • git add 命令读取工作区文件,更新 .git/index 和可能写入 objects 目录。

  • git commit 命令将 index 写入 tree 对象,并更新 refs/heads/<当前分支> 为新 commit SHA。

  • git branch 命令仅创建 refs/heads/<name>,不影响 index 和工作区。

  • git checkout 命令切换分支,更新 HEAD 和工作区内容。

  • git reset 命令有多种模式,影响 HEAD、index 和工作区的状态。

  • git reset 不会删除已有的 blob 对象,历史提交中的文件内容仍可被引用。

🔎

延伸解读

Git 命令的磁盘影响

理解 Git 命令对磁盘的影响是使用 Git 的关键。每个命令不仅改变了工作区的状态,还会影响 `.git` 目录的结构。例如,`git add` 会更新索引并可能写入新的对象,而 `git commit` 则会创建新的提交对象并更新分支引用。掌握这些细节有助于更好地管理版本控制。

命令间的相互作用

Git 的命令并不是孤立的,它们之间存在相互作用。例如,`git branch` 仅创建分支引用,不会影响工作区或索引,但如果与 `git checkout` 结合使用,则会改变当前工作区的内容。理解这些命令的关系可以帮助用户更有效地进行版本管理。

git reset 的多种模式

`git reset` 提供了多种模式(如 --soft、--mixed 和 --hard),每种模式对 HEAD、索引和工作区的影响不同。用户在使用时需谨慎选择,以避免意外丢失未提交的更改。尤其是 --hard 模式,会将工作区和索引都重置到新 HEAD,可能导致数据丢失。

延伸问答

git add 命令的作用是什么?

git add 命令读取工作区文件,更新 .git/index,并可能写入 objects 目录。

git commit 命令如何影响 Git 的对象库?

git commit 命令将 index 写入 tree 对象,并更新 refs/heads/<当前分支> 为新 commit SHA。

git branch 命令的主要功能是什么?

git branch 命令仅创建 refs/heads/<name>,不影响 index 和工作区。

git checkout 命令是如何工作的?

git checkout 命令切换分支,更新 HEAD 和工作区内容。

git reset 命令有哪些模式?

git reset 命令有 --soft、--mixed(默认)和 --hard 三种模式,分别影响 HEAD、index 和工作区的状态。

git reset 是否会删除已有的 blob 对象?

git reset 不会删除已有的 blob 对象,历史提交中的文件内容仍可被引用。

🏷️

标签

➡️

继续阅读