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.md 和 website.txt。当执行 git restore --source=8cb34d1 README.md命令后,只有 README.md 恢复成了第一次提交时的内容。而 website.txt 文件的内容没有变化,也没有被删除。
练习:
- 修改
my_project中的README.md文件。使用git status查看修改后的状态。 - 将
README.md文件添加到暂存区。然后删除工作区的README.md文件。 - 使用暂存区来恢复你删除的
README.md文件,查看文件的内容是你修改后的文件内容还是没有修改的内容? - 删除暂存区添加
README.md文件的记录。 - 删除工作区
README.md文件。 - 使用
git restore恢复README.md文件。并查看文件的内容是修改前的内容还是没有修改前的内容。 - 使用
git mv命令 修改README.md文件名为README.txt,然后使用git status查看其状态。 - 想办法通过本节课的四个
git命令将my_project恢复成干净的状态(没有修改前的状态),包括清空暂存区。
上述操作请不要使用
git commit命令进行提交。