目录
一、修改文件(git status、git diff)
二、版本回退(git reset)(mixed、soft、hard)
一、修改文件(git status、git diff)
Git跟踪并管理的是修改,⽽⾮⽂件。
⽐如你新增了⼀⾏,这就是⼀个修改,删除了⼀⾏,也是⼀个修改,更改了某些字符,也是修改,删除增加也是,甚至创建也是修改。
在第二章中test里的内容是1234
在此对test里的内容进行了修改,此时,仓库中的test和我们⼯作区的test是不同的,如何查看当前仓库的状态呢? git status命令⽤于查看在你上次提交之后是否有对⽂件进⾏再次修改。
上⾯的结果告诉我们,test被修改过了,但还没有完成添加与提交。 ⽬前,我们只知道⽂件被修改了,如果能知道具体哪些地⽅被修改了,就更好了。(这个就可以记录很长时间,比如3天前,7天前?修改了什么)
git diff [file]命令⽤来显⽰暂存区和⼯作区⽂件的差异,显⽰的格式正是Unix通⽤的diff格式。也可以使⽤ git diff HEAD -- [file] 命令来查看版本库和⼯作区⽂件的区别。知道了对test做了什么修改后,再把它提交到本地仓库就放⼼多了。
二、版本回退(git reset)(mixed、soft、hard)
之前我们也提到过,Git能够管理⽂件的历史版本,这也是版本控制器重要的能⼒。如果有⼀天你发现 之前前的⼯作做的出现了很⼤的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本 回退的功能了。
执⾏ git reset 命令⽤于回退版本,可以指定退回某⼀次提交的版本。要解释⼀下“回退”本质是要将版本库中的内容进⾏回退,⼯作区或暂存区是否回退由命令参数决定: git reset 命令语法格式为: git reset [--soft | --mixed | --hard] [HEAD]
- --mixed 为默认选项,回退暂存区。
使⽤时可以不⽤带该参数。该参数将暂存区(index)的内容退回为指定提交版本内容,⼯作区⽂件保持不变。
- --soft 回退版本库
参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
- --hard 回退工作区、暂存区⚠️
参数将暂存区与⼯作区都退回到指定版本。⚠️切记⼯作区有未提交的代码时不要⽤这个命令,因为⼯作区会回滚⚠️(当前编辑的代码会回滚),你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重。
- HEAD 说明:
可以直接写成commit id,表⽰指定退回的版本
◦ HEAD 表⽰当前版本
◦ HEAD^ 上⼀个版本
◦ HEAD^^ 上上⼀个版本
◦ 以此类推...
可以使⽤〜数字表⽰:
◦ HEAD~0 表⽰当前版本
◦ HEAD~1 上⼀个版本
◦ HEAD^2 上上⼀个版本
◦ 以此类推...
可以自行进行提交测试
可以看见HEAD指向了2,这个时候再进行打印的话就会看见,是这个样子
这个时候想再拿到第三次提交,只能用版本号回退,如果clear了那么。
Git还提供了⼀个git reflog命令能补救⼀下,该命令⽤来记录本地的每⼀次命令。
这样,你就可以很⽅便的找到你的所有操作记录了,7c4c8ae这个就是第3次提交的 commit id 的部分。
Git版本回退的时候,也可以使用部分commit id来代表目标版本。
又回到第三次提交了。
实际开发的时候,长时间的开发,导致commit id早就找不到了,所以并不能再回去了。
总而言之,Git的版本回退速度很快,因为Git在内部有指向当前分支的HEAD指针,如master在refs/heads/master文件里保存当前master分支的最新commit id。当我们在版本回退的时候,Git仅仅是给refs/heads/master中存储一个特定的版本,可以简单理解成下图: