一 .管理修改
首先, 我们需要知道: Git跟踪并管理的是修改,而非文件。这也是 Git 比其他版本控制系统设计得优秀的地方 !
我们可以这样验证:
1.对readme.txt
做一个修改,比如增加两行内容:
Git is a distributed version control system.
Git is free software.
Git has a mutable index called stage.
Git tracks changes.
然后,添加:
$ git add readme.txt
我们再看下状态
$ git status
会看到:
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: readme.txt
接着我们再对readme.txt
做一下修改, 修改后内容如下:
Git is a distributed version control system.
Git is free software.
Git has a mutable index called stage.
Git tracks changes of files.
提交:
$ git commit -m "git tracks changes"
会看到:
[master 4f432db] git tracks changes
1 file changed, 2 insertions(+)
紧接着我们再看一下状态:
$ git status
会出现这样的提示 :
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
我们可以使用 $ git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别
diff --git a/readme.txt b/readme.txt
index 3804fcd..dee2170 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
Git is a distributed version control system.
Git is free software.
Git has a mutable index called stage.
-Git tracks changes.
+Git tracks changes of files.
可见,第二次修改确实没有被提交。
我们整个操作的流程是这样的 :
第一次修改 -> git add -> 第二次修改 -> git commit
当我们用git add
命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
所以我们的操作流程应该是这样的 :
第一次修改 -> git add -> 第二次修改 -> git add -> git commit
二.撤销修改
通过上面的讲述, 我们已经知道怎么去提交修改了. 那么又出现了一个新的问题 : 如何撤销修改呢?
现在假设我的 readme.txt
文件中出现了一个错误的修改 :
Git is a distributed version control system.
Git is free software.
Git has a mutable index called stage.
Git tracks changes of files.
I am a girl !
( 我怎么可能是个girl? )
所以, 我在提交之前需要撤销修改 .( 当然, 我可以找到这个文件并手动删除最后一行,把文件恢复到上一个版本的状态 , 但是这样好像不是很方便 )
我们使用命令 $ git status
查看下状态 :
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
Git 告诉我, 我可以使用 $ git checkout -- file
可以丢弃工作区的改动
$ git checkout -- readme.txt
现在,看看readme.txt
的文件内容:
$ cat readme.txt
会发现, I am a girl !
这句话已经没有了 !
Git is a distributed version control system.
Git is free software.
Git has a mutable index called stage.
Git tracks changes of files.
三.删除文件
我们在readme.txt
所在文件夹中新建一个 test.txt
文件, 并使用 git add
和 git commit
命令提交
一般情况下,我们通常直接在文件管理器中把没用的文件删了,或者用rm
命令进行删除:
$ rm <fileName>
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status
命令会立刻告诉我们哪些文件被删除了:
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add/rm <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
删除: test.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
现在我们有两个选择 :
1.确实要从版本库中删除该文件,那就用命令git rm
删掉,并且git commit
:
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master 0c79b43] remove test.txt
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 test.txt
2.删错了, 但是版本库里还有, 我们执行
$ git checkout -- test.txt
test.txt
就又回来了 !