Git学习之Git的状态
我们创建了我们的仓库,我们还需要关注文件在Git管理的状态,记录每次更新的状态
1. 基本概念
文件的状态分为以下几种:untracked(未跟踪的)、unmodifed(未修改的)、modified(修改过的)、staged(暂存),可以从官方文档这张生命周期图很形象的看出:
工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。
- 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。
- 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
- 编辑过某些文件之后,由于自上次提交后你对它们做了修改,Git 将它们标记为已修改文件。 我们逐步将这些修改过的文件放入暂存区,然后提交所有暂存了的修改,如此反复。
2.具体操作
检查当前文件的状态
如果需要查看文件当前处于什么状态可以使用命令git status
,如果是一个刚刚提交过的仓库,你输入查询状态的命令,会出现以下的现象:
$ git status
On branch master
nothing to commit, working directory clean
这说明你处于分支master
下,分支后面会讲解,nothing to commit, working directory clean
说明当前工作空间是干净的。所有已跟踪文件在上次提交后都未被更改过。 此外,上面的信息还表明,当前目录下没有出现任何处于未跟踪状态的新文件,否则 Git 会在这里列出来。
现在,让我们在项目下创建一个新的 README 文件。 如果之前并不存在这个文件,使用 git status 命令,你将看到一个新的未跟踪文件:
$ git status
On branch 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
状态,Git建议我们使用git add <file>...
去跟踪这个文件。
跟踪新的文件
从上面我们知道,README文件没有被跟踪,这里我们使用git add <file>
去跟踪这个文件
git add README
再次运行git status
观察文件状态
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
只要在 Changes to be committed
这行下面的,就说明是已暂存状态。 如果此时提交,那么该文件此时此刻的版本将被留存在历史记录中。 你可能会想起之前我们使用 git init
后就运行了git add (files)
命令,开始跟踪当前目录下的文件。 git add
命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。
暂存已修改文件
如果我们有一个已经跟踪的文件 CONTRIBUTING.md
,我们现在修改它的内容,然后我们看下它的状态:
$ git status
On branch 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
可以看到它处于modified
状态,Git提示Changes not staged for commit:
,说明已跟踪文件的内容发生了变化,但还没有放到暂存区,要想放到暂存区,我们需要使用git add
命令,这个命令到这里我们知道,可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 我们按照Git的提示使用git add
命令并观察状态:
$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
看到Changes to be committed:
说明目前已经添加我们修改过的文件到暂存区,值得注意的是Git跟踪的是文件的修改,同时考虑三棵树的问题接,如果这个时候我们再次修改CONTRIBUTING.md
内容,然后再次查看状态就会发现
$ git status
On branch 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
版本,而且是最新的,而暂存区又存在刚才我们修改过的CONTRIBUTING.md
版本,也就是三棵树的问题。
最后我们将最新的版本加到暂存区,使用git add <files>
命令,然后提交到仓库,使用git commit -m"注释"
:
$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
状态命令拓展
git status 命令的输出十分详细,但其用语有些繁琐。 如果你使用 git status -s 命令或 git status --short 命令,你将得到一种更为紧凑的格式输出。 运行 git status -s ,状态报告输出如下:
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。 你可能注意到了 M 有两个可以出现的位置,出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区。 例如,上面的状态报告显示: README 文件在工作区被修改了但是还没有将修改后的文件放入暂存区,lib/simplegit.rb 文件被修改了并将修改后的文件放入了暂存区。 而 Rakefile 在工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录。