GIT学习笔记
修改管理、撤销
管理修改
- 为什么Git比其他版本的控制系统设计的优秀,因为Git跟踪并管理的是修改,而非文件。也就是说,所有修改,比如增加一行、删除一行、甚至创建一个新文件也算是修改。
- 为什么说Git管理的是修改而不是文件呢?我们可以做一个实验,第一步,对
readme.txt
做一个修改,比如加一行内容并添加:
$ git add readme.txt
$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
- 然后,再修改
readme.txt
并提交:
$ git commit -m "git tracks changes"
[master 376d9c0] git tracks changes
1 file changed, 1 insertion(+)
- 提交后,再看看状态:
$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
- 我们发现,第二次的修改没有被提交。回顾一下操作过程:
第一次修改->git add
->第二次修改->git commit
- 前面讲到,git管理的是修改,当使用
git add
命令后,在工作区的第一次修改被放入暂存区准备提交。但是,在工作区的第二次修改并没有放入暂存区,所以,git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次修改不会被提交。 - 提交后,用
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.
- 可见,第二次修改确实没有被提交。
- 那怎么才能提交第二次修改呢?可以继续
git add
再git commit
,也可以不着急提交第一次修改,先git add
第二次修改,再git commit
,相当于是把两次修改合并后一起提交了。
撤销修改情况一
- 如果在
readme.txt
文件中多添加了一行,提交后,用git status
查看,Git会提示使用git checkout -- <file>...
可以丢弃工作区的修改。
$ git checkout -- readme.txt
- 命令
git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:- 一种是
readme.txt
自修改后还没有放到暂存区,现在,舍小修改就回到和版本库一模一样的状态; - 一种是
readme.txt
已经添加到暂存区后,又做了修改,现在,撤销修改就回到添加到暂存区后的状态。
- 一种是
- 总之,就是让这个文件回到最近一次
git commit
或git add
时的状态。 - 撤销后,我们再看看
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 checkout -- file
命令中的--
很重要,没有--
,就变成了切换到另一个分支的命令,我们在后面的分支管理中会再次遇到git checkout
命令。
撤销修改情况二
- 如果要被撤销的内容不但被写入了文件,还被
git add
添加到暂存区了,在commit
前发现了这个问题,用git status
查看,修改只是添加到了暂存区,还没有被提交:
$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: readme.txt
- Git同样告诉我们,用命令
git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区。
$ git reset HEAD readme.txt
重置后取消暂存的变更:
M readme.txt
- 再用
git status
查看一下,确保暂存区是干净的,工作区有修改
$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
- 这样我们可以再使用
checkout
来丢弃工作区的修改。
撤销修改情况三
- 如果把要被修改的文件提交到了版本库,我们就要使用前面学过的版本回退 。不过这是有条件的,即在推送到远程版本库之前进行版本回退。
删除文件
- 在Git中,删除文件也是一种修改操作,我们先添加一个
test.txt
文件到Git中并提交:
$ git add text.txt
$ git commit -m "add text.txt"
[master 89274d2] add text.txt
1 file changed, 2 insertions(+)
create mode 100644 text.txt
- 然后如果我们想删除那些没用的文件,就可以直接在文件管理器中删除、或者使用
rm
命令删除:
$ rm text.txt
- 这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,
git status
命令会立刻告诉你哪些文件被删除了:
$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add/rm <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
删除: text.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
- 现在有两种选择,一是确实从版本库中删除文件,就用命令
git rm
删掉,并且git commit
:
$ git rm text.txt
rm 'text.txt'
$ git commit -m "delete text.txt"
[master acc1af6] delete text.txt
1 file changed, 2 deletions(-)
delete mode 100644 text.txt
- 这样就把文件从版本库中删除了。
先手动删除文件,再使用
git rm <file>
和git add <file>
效果是一样的。
- 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout
其实是用版本库里的版本替换工作区的版本,所以无论工作区是修改还是删除,都可以“一键还原”。
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的。