Apong's Blog

当你快坚持不住的时候,困难也快坚持不住了

0%

Git 文件状态梳理

文件状态

Git文件的四种状态

下面以新增 README.md 文件为例

Untracked

未被 Git 跟踪的文件状态

  1. 新创建
  2. 从其他地方移动过来(复制 / 剪切等)

image-20240325104023093

Staged

使用 git add <file> 命令将文件加入暂存区,转化为 Staged 状态

image-20240325104341887

使用 git rm --cached <file> 可以将文件移出缓存区,重新变为 Untracked 状态

image-20240325104726863

文件当前内容

1
123

Modified

Staged 已经存入暂存区的文件进行修改,转化为 Modified 状态

文件修改后

1
2
123
restore 丢弃的内容

image-20240325105331466

可以看到和 Untracked 状态一样,被 Git 标红了

意味着此时暂存区内该文件的内容还是 123,需要重新使用 git add <file> 命令将本次修改保存到 Git 中(更新 Git 的 diff 内容)。

后续命令

  • git restore <file>,丢弃本次修改,恢复到当前暂存区存取的内容(最后一次被修改之前的状态)
  • git checkout <file> 等价于 restore

文件 restore 后

1
123

应用场景

操作涉及 工作区 和 暂存区 两个区域。

当工作到某个重要节点,你需要在这个节点上进行扩展,但是你又不确定这个扩展是否可行

这时候就可以 “stage” 这个节点,然后继续修改,如果不可行就通过 git restore <file> 回到这个节点,丢弃掉所有修改内容。

当然如果这个节点是重要且确定的,你可以直接 git add <file> => git commit 将其提交到本次仓库中

提问

  1. 如果我 “stage” 了这次新的修改,原先的节点还能找到吗 :x:

UnModified

Staged 状态的文件(暂存区的文件)通过 git commit 提交到本次仓库中,转化为 Unmodified 状态。

为了后续追踪文件内容,添加了一行 commit 标志

1
2
3
123

第一次commit

image-20240325114403701

commit 提交后,该文件就加入本地仓库了,并输出了本次 commit 的 branch(master)和 refs(9db5ee9)。

接下来继续对文件进行修改(工作区)、保存(暂存区)、提交(本地仓库),完成一整个流程。

1
2
3
4
5
123

第一次commit

修改内容

image-20240325115211160

状态流程

新加入的文件

1
2
3
4
// 首次加入
Untracked =(add)=> Staged =(self update)=> Modified =(commit)=> UnModified
// 追踪更改
=(self update)=> Modified =(add)=> Staged =(commit)=> UnModified

已追踪的文件

1
2
// 追踪更改
=(self update)=> Modified =(add)=> Staged =(commit)=> UnModified

注意:未被追踪的文件,无论怎么修改都不会被 Git 管理为 Modified 文件

image-20240326000827982