文件状态
你工作目录下的每一个文件只有两种状态:tracked 或 untracked
tracked
- 已跟踪 tracked 的文件是指那些被纳入了版本控制的文件
- 在上一次快照中有它们的记录,在工作一段时间后, 它们的状态可能是未修改unmodified、已修改modified 或已放入暂存区staged
- 简单来说,已跟踪 tracked 的文件就是 Git 知道的文件
untracked
- 工作目录中除 tracked 文件外的其它所有文件都属于 untracked 文件
- 它们既不存在于上次快照的记录中,也没有被放入暂存区
- 初次 clone 某个仓库的时候,工作目录中的所有文件都属于 tracked 文件,并处于 unmodified
- 编辑文件后,Git 将它们标记为 modified 文件。 在工作时,你可以选择性地将这些修改过的文件放入暂存区,然后提交所有已暂存的修改
文件的状态变化周期
检查当前文件状态
可以用 git status
命令查看哪些文件处于什么状态。 如果在克隆仓库后立即使用此命令,会看到类似这样的输出:
git status On branch master Your branch is up-to-date with 'origin/master'. nothing to commit, working directory clean
可以获取到的内容
- 所有 tracked 件在上次提交后都未被更改过
- 当前目录下没有出现任何 untracked 的新文件,否则 Git 会在这里列出来
- 还显示了当前所在分支,并告诉你这个分支同远程服务器上对应的分支没有偏离,现在,分支名是“master”,这是默认的分支名
在项目下创建一个新的 README
文件,使用 git status
命令,将看到一个新的 untracked 文件
echo 'My Project' > README $ git status On branch master Your branch is up-to-date with 'origin/master'. Untracked files: (use "git add <file>..." to include in what will be committed) README nothing added to commit but untracked files present (use "git add" to track)
可以获取到的内容
README
文件出现在Untracked files
下面- untracked 的文件意味着 Git 在之前的快照(提交)中没有这些文件
如何跟踪
git add 文件名
# 更新目录下所有文件
git add .
后面会再详细讲这个命令
跟踪新文件
使用命令 git add
开始跟踪一个文件。 所以,要跟踪 README
文件,运行:
git add README
此时再运行 git status
命令,会看到 README
文件已被跟踪,并处于 staged
git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git restore --staged <file>..." to unstage) new file: README
可以获取到的内容
- 只要在
Changes to be committed
这行下面的,就说明是 staged 状态 - 如果此时提交,那么该文件在你运行
git add
时的版本将被留存在后续的历史记录中
暂存已修改的文件
如果修改了一个名为 CONTRIBUTING.md
的已被 tracked 的文件,然后运行 git status
命令,会看到下面内容
git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: CONTRIBUTING.md
可以获取到的内容
CONTRIBUTING.md
出现在Changes not staged for commit
这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区- 要暂存这次更新,需要运行
git add
命令
再次运行 git add 命令
运行 git add
将“CONTRIBUTING.md”放到暂存区,然后再看看 git status
的输出:
$ git add CONTRIBUTING.md $ git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README modified: CONTRIBUTING.md
再次修改文件内容
编辑 CONTRIBUTING.md
,再运行 git status
看看
$ vim CONTRIBUTING.md $ git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README modified: CONTRIBUTING.md Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: CONTRIBUTING.md
可以获取到的内容
CONTRIBUTING.md
文件同时出现在暂存区和非暂存区- 实际上 Git 只不过暂存了运行
git add
命令时的版本 - 如果你现在提交代码,
CONTRIBUTING.md
的版本是你最后一次运行git add
命令时的那个版本,而不是当前版本 - 所以,运行了
git add
之后又编辑了文件,需要再次git add
把最新版本暂存
$ git add CONTRIBUTING.md $ git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README modified: CONTRIBUTING.md
真实的实际操作栗子