git 和 svn 之间的区别就是多了一个暂存区,这个暂存区允许我们多次添加文件,然后在提交快照的时候,一次 commit 到本地仓库。
通过命令行来演示一次加深印象。
在我们的本地仓库文件夹 GitLearn 中添加 一个 hi.txt,并且修改 README.md 文件。然后调用命令行 git status
查看当前状态。
$ git status
On branch master
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: README.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
hi.txt
no changes added to commit (use "git add" and/or "git commit -a")
因为我们修改了 README.md 文件而没有 add 到暂存区,所以 git 提示我们,Changes not staged for commit: modified: README.md,我们修改过的文件 README.md 没有 提交到暂存区,并且其实我们可以使用 git add 命令。
我们新增的 hi.txt 文件从来没有添加到暂存区过,所以 git 提示我们 Untracked files: hi.txt
。
接下来我们执行git add
命令将修改和新增文件添加到暂存区,然后使用git status
看看状态有什么变化。
$ git add .
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.md
new file: hi.txt
这一次告诉我们,需要commit
,而不再提示有未添加的新文件和未提交的修改了。接着调用 git commit
命令行 看看状态有什么变化。
$ git commit -m "add new file and change README"
[master 39b16df] add new file and change README
2 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 hi.txt
$ git status
On branch master
nothing to commit, working tree clean
这次提示我们没有什么需要提交的快照,工作区很干净。这时候暂存区就没有什么内容了。
很多人说,git 之所以比 svn 优秀,就是因为有暂存区的存在。而 git 跟踪的就是我们对文件的修改而非文件自身。我们新增、修改、删除文件,这都是算对文件的修改。我们实操验证一下这个结论:
第一步,我们修改 README 文件
第二步,add 修改到暂存区
第三步,再次修改 README 文件
第四步,commit 提交快照到本地仓库
第五步,git status 查看当前状态
如果上述流程走完,我们第二次对 README文件的修改提交到了仓库,那么说明 git 管理的是文件自身;如果我们第二次对文件的修改是在工作区还没有提交到暂存区,那么就说明 git 管理的是对文件的修改,而非文件自身。
// 修改README,然后执行 add 操作
$ git add .
// 再次修改 README ,然后执行 commit 操作
$ git commit -m "提交修改"
[master bab594b] 提交修改
1 file changed, 4 insertions(+), 1 deletion(-)
// 查看状态
$ git status
On branch master
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: README.md
no changes added to commit (use "git add" and/or "git commit -a")
从命令行运行结果中我们看到,我们的第二次修改,并没有被提交到仓库,git 依然提示我们 README 文件有被修改,但是没有提交到暂存区。
这个结果,验证了我们的结论,那就是:git 管理的是对文件的修改,而非管理文件的内容。
总结:
整个流程下来我们知道:日常工作中,我们在工作区编写代码,新增文件和修改文件都会被 git 跟踪到,我们 add 的时候,是将文件首先提交到暂存区,然后 commit 的时候才是将快照提交到 本地仓库,这期间,工作区是否有文件没有提交到暂存区和暂存区是否有文件没有提交到仓库,git 都会帮助我们跟踪。
git 跟踪的并不是我们的文件本身,而是跟踪的我们的修改。
网友评论