Git相较于其他版本控制系统的优势在于其独特的设计:Git跟踪并管理的是修改,而非文件。这一特性让Git在处理版本控制时表现得更为出色。
理解“修改”这一概念至关重要。在Git中,无论是增加、删除还是更改一行内容,甚至创建一个新文件,都被视为一个修改。Git关注这些底层的变动,而非文件本身。
为了深入理解这一点,我们可以通过一个简单的实验来演示。首先,我们对readme.txt
文件进行了一次修改,并添加了新内容。
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.
然后,使用git add
命令将这次修改放入暂存区,准备提交。
$ git add readme.txt
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: readme.txt
#
然而,在提交之前,我们对同一文件进行另一次修改。
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
现在我们执行git commit
命令时,只有第一次的修改被提交了,第二次的修改并未包含在内。
$ git commit -m "git tracks changes"
[master 519219b] git tracks changes
1 file changed, 1 insertion(+)
$ 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.txt
no changes added to commit (use "git add" and/or "git commit -a")
这是因为Git管理的是修改,而不是文件。当我们使用git add
命令时,Git会将工作区的修改放入暂存区,准备提交。然而,如果我们在git add
之后再次修改文件,这些新的修改并不会自动进入暂存区。因此,当我们执行git commit
命令时,只有暂存区中的修改会被提交。
这一特性使得Git在处理版本控制时具有更高的灵活性和准确性。它可以让我们精确地控制哪些修改应该被提交,哪些修改应该被保留在工作区。同时,由于Git跟踪的是修改而非文件,它在处理大量文件或大型项目时也能保持高效的性能。
提交后,用git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别:
$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 76d770f..a9c5755 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
-Git tracks changes.
+Git tracks changes of files.
可见,第二次修改确实没有被提交。