3.工作区和暂存区操作

在 Git 中,工作区是用来存储当前编辑文件的文件夹,暂存区是存放将要提交到仓库的文件的快照。以下介绍常用于工作区和暂存区的命令。

命令
说明
git add
添加文件内容至索引(暂存区) 文件转为已跟踪状态。
git mv
移动或重命名一个已跟踪的文件、文件夹或符号链接
git rm
从工作区和索引(暂存区)中删除文件,并记录删除操作,文件转为未跟踪状态。
git restore
使用工作区或本地仓库文件恢复工作区和暂存区的修改。

git add 命令

作用:添加文件内容至暂存区,准备提交到仓库中,加入暂存区的文件一定是已跟踪状态。

命令格式

git add 文件或文件夹1 文件或文件夹2 ...

示例:

# 将文件 a.txt,b.txt 记录到暂存区
git add a.txt b.txt 

# 将所有文件(不包含隐藏文件)记录到暂存区
git add *

注意

以上命令记录到暂存区是对当前文件状态的记录,后续如果在工作区对文件进行修改,则暂存区的内容不会改变。

git mv 命令

作用:移动或重命名一个已跟踪的文件、文件夹或符号链接。

命令格式

git mv 文件或文件夹1 文件或文件夹2

示例:

# 将已跟踪的文件a.txt 更名为b.txt,同时放入暂存区。
git mv a.txt b.txt

# 将已跟踪的文件c.txt 移动到 mydir 文件夹,同时放入暂存区。
git mv c ./mydir/

git rm 命令

作用: 从工作区和索引(暂存区)中删除文件,并记录删除操作,文件转为未跟踪状态。

命令格式

# 在暂存区里面的添加删除文件记录,同时删除文件
git rm [选项] 文件或文件夹1 文件或文件夹2 ...

# 在暂存区里面的添加删除文件记录,但不会删除文件
git rm --cached 文件或文件夹1 文件或文件夹2 ...

git rm 常用选项

选项
说明
--cached
在暂存区里面的添加删除文件记录,但不会删除工作区文件。

示例:

# 将已跟踪文件 a.txt 和 b.txt 从暂存区删除,但文件a.txt、b.txt 依旧保存在工作区
git rm --cached  a.txt b.txt
# 将已跟踪文件 c.txt 从暂存区删除,同时删除工作区里面的 c.txt
git rm c.txt

git restore 命令

作用:使用工作区或本地仓库文件恢复工作区和暂存区的修改。

命令格式

git restore [选项] [--] 文件或文件夹1 文件或文件夹2 ...

说明:

常用选项

选项
说明
--source=<提交对象>
恢复当前工作区的内容为某个提交时的内容。
--staged
撤销暂存区文件记录。
--worktree <文件路径>
恢复当前工作区的某个路径,. 代表当前工作区。

在上一节的 my_project 项目 中已经有两次提交。提交日志如下:

weimingze@mzstudio:~/my_project$ git log --oneline
5dcccb0 (HEAD, master) 魏明择在当前项目中修改了 README.md 文件,并添加了website.txt文件
8cb34d1 魏明择在当前项目中添加了 README.md 文件

我们可以使用 git restore--source 选项将工作区的一个文件或整体恢复成某次提交后的状态。如:

# 恢复第一次提交全部文件到当前工作区,参数 . 代表整个工作文件夹(工作树)。
git restore --source=8cb34d1 .

# 恢复第一次提交的 README.md 文件到当前工作区,其它工作区的文件不变
git restore --source=8cb34d1 README.md

示例:

weimingze@mzstudio:~/my_project$ ls
README.md  website.txt
weimingze@mzstudio:~/my_project$ git restore --source=8cb34d1 .
weimingze@mzstudio:~/my_project$ ls
README.md
weimingze@mzstudio:~/my_project$ git restore .
weimingze@mzstudio:~/my_project$ ls
README.md  website.txt
weimingze@mzstudio:~/my_project$ git restore --source=8cb34d1 README.md
weimingze@mzstudio:~/my_project$ cat README.md
# Git 教程
weimingze@mzstudio:~/my_project$ cat website.txt
https://weimingze.com

从上述示例中 git restore --source=8cb34d1 . 整个工作区还原成了 第一次提交时的状态(只有一个文件 README.md,当执行 git restore . 工作区用恢复了第二次提交时的状态(两个文件 README.mdwebsite.txt。当执行 git restore --source=8cb34d1 README.md命令后,只有 README.md 恢复成了第一次提交时的内容。而 website.txt 文件的内容没有变化,也没有被删除。

练习:

  1. 修改 my_project 中的 README.md 文件。使用 git status 查看修改后的状态。
  2. README.md 文件添加到暂存区。然后删除工作区的 README.md 文件。
  3. 使用暂存区来恢复你删除的 README.md 文件,查看文件的内容是你修改后的文件内容还是没有修改的内容?
  4. 删除暂存区添加 README.md 文件的记录。
  5. 删除工作区 README.md 文件。
  6. 使用 git restore 恢复 README.md 文件。并查看文件的内容是修改前的内容还是没有修改前的内容。
  7. 使用 git mv 命令 修改 README.md 文件名为 README.txt,然后使用 git status 查看其状态。
  8. 想办法通过本节课的四个 git 命令将 my_project 恢复成干净的状态(没有修改前的状态),包括清空暂存区。

上述操作请不要使用 git commit 命令进行提交。