参考链接:https://www.liaoxuefeng.com/wiki/896043488029600/897884457270432
Git之所以比其他版本控制系统设计得优秀,就是因为Git跟踪并管理的是修改,而非文件。
比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
练习(为了理解管理的不是文件,是修改)
练习的结论:每次修改,如果不用git add
到暂存区,那么这次修改就不会被记录,另外使用checkout filename ,filename 这个文件就会被回复到上次add filename 的版本
将对一个文件进行两次修改,然后将第一次修改的的添加,并在第二次修改后commit(不对第二次添加)我们知道,将一个文件提交到仓库,必须先添加然后在commit,我们回想一下我们这次练习的任务,是为了区分Git管理的是修改而不是文件,那么第二次的修改没有add,commit就不会添加第二次修改。
第一步,对readme.txt做一个修改,比如加一行内容:
然后,添加:
$ 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:
提交:
λ git commit -m "git trackes(跟踪器) change"有中文时应该用双引号 [master 22ccc69] git trackes(跟踪器) change 1 file changed, 2 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.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 db28b2c..9a8b341 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. No newline at end of file +Git tracks changes of files. No newline at end of file
怎么提交第二次的修改呢?
那怎么提交第二次修改呢?你可以继续git add
再git commit
,也可以别着急提交第一次修改,先git add
第二次修改,再git commit
,就相当于把两次修改合并后一块提交了:
第一次修改 -> git add
-> 第二次修改 -> git add
-> git commit
撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
参考链接:https://www.liaoxuefeng.com/wiki/896043488029600/897889638509536
1)撤销工作区的修改
手动解决办法,你可以自己编辑文本。手动把文件恢复到上一个版本的状态
Git checkout -- file
可以丢弃工作区的修改:
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
注意
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout
命令。
2)撤销暂存区(stage)的修改
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
现在,假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?还记得版本回退一节吗?可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。还记得Git是分布式版本控制系统吗?我们后面会讲到远程版本库,一旦你把stupid boss
提交推送到远程版本库,你就真的惨了……