Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/
- 管理修改
首先我们需要明确,为什么说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 readme.txt $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: readme.txt #
然后再修改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 -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 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第二次的修改,再git commit,就相当于把两次修改合并后一块提交:
第一次修改 --> git add --> 第二次修改 --> git add -->git commit
- summary
现在你应该理解了Git是如何跟踪修改的,每次修改,如果不用 add git到暂存区,那就不会加入到commit中。
git diff filename:比较工作区和暂存区
git diff HEAD -- filename:比较工作区和版本库的最新版本
如果git diff输出空白就说明工作区是干净的(干净应该就是指与比较的区相同)
- 撤销修改
当你在文件中有的修改是错误的,但是你还是提交了。比如你在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. My stupid boss still prefers SVN.
因为错误发现的很及时,你可以删掉最后一行,手动将文件恢复到上个版本的状态。如果用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.txt no changes added to commit (use "git add" and/or "git commit -a")
你会发现,Git告诉你,git checkout -- file可以丢弃工作区的修改:
$ 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到了暂存区:
$ 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. My stupid boss still prefers SVN. $ git add readme.txt
但是庆幸的是,在commit之前,你发现了这个问题。用git status查看一下,修改只是添加到了暂存区,还没有提交:
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: readme.txt
Git同样告诉我们,用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
再用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.txt
还记得如何丢弃工作区的修改么?
$ git checkout -- readme.txt
$ git status
On branch master
nothing to commit, working tree clean
现在你不但改错了东西,还从暂存区提交到了版本库。你可以回退到上一个版本,不过这是有条件的,就是你还没有把自己的本地版本库推送到远程。
后面会学习到远程版本库,一旦你把错误内容提交到了远程版本库,那就GG了......
- Summary
- 当你修改乱了某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
- 当你不但修改乱了某个文件的内容,还添加到了暂存区,想丢弃修改,分两步。
- git reset HEAD <file>回到场景1
- 第二步按照场景1操作
- 已经提交了不合适的修改到版本库,想要撤销本次提交,参考第一课,不过是前提没有推送到远程库
对你有帮助就支付宝请我喝可乐叭~~~
$ git checkout -- readme.txt
$ git status
On branch master
nothing to commit, working tree clean