git学习笔记(六)--git的恢复
这里先来温习一下git关于检出和重置最常用的5个命令:
- git reset -- filename //撤销add到暂存区中的内容,但工作区不改变
- git checkout -- filename //用暂存区内容覆盖当前工作区内容
- git checkout <commit> -- filename //用commit指向的内容覆盖工作区和暂存区(同6,但不撤销这个commit)
- git reset --soft HEAD^ //撤销上一次的提交,但不改变工作区和暂存区内容(HEAD指向改变而已)
- git reset //撤销上一次提交,并且暂存区被上一次提交时的暂存区内容覆盖
- git reset --hard HAED^ //撤销上一次提交,完全用上一次提交时的工作区和暂存区覆盖当前的工作区和暂存区的内容
git 除了使用checkout和reset来重置返回之前的状态以外,还可以使用stash命令来保存当前的工作进度,这样我们也可以随时返回上一次的工作状态。
下面通过一个例子,来详细的分析一下stash的使用:
1. 对一个文件进行修改,使得当前工作区,暂存区和版本库中的内容都不相同:

在上图中,相比于上一次提交,版本库中只多了hello_3,暂存区中多了hello_3和hello_4,工作区中多了hello_3,hello_4,hello_5
2. 保存进度,然后查看git的记录和日志情况:


这里说明一下,如果暂存区和工作区的内容相同,则上个图片中,第一个和第二个commit的treeID会是相同的
在版本库.git中,历次stash的进度保存在(.git/refs/stash引用)所指向的提交中,比如上上一个图,git reflog show refs/stash后出现的是caeld9d,这个就是这一次stash的时候工作区的提交ID
而在.git/logs/refs/stash中,则保存的是每一次(.git/refs/stash引用)的变化情况
3.关于stash命令的用法:
- git stash //保存进度
- git stash list //显示已保存的进度列表
- git stash pop //恢复最新的一个进度,并在进度列表中删除该进度,但若暂存区有未commit的内容,则丢失
- git stash pop --index //同上,但保留暂存区中未commit的内容
- git stash apply [--index] //用法同pop,但不删除该进度
- git stash drop [<stash>] //删除记录
- git stash clear //删除全部进度记录
- git stash branch //基于进度创建分支
4. stash保存进度时的失败情况:
(1)如果一个文件或修改没有被分支追踪,也就是说没有add,就不能stash
(2)如果当前工作区有未commit的修改,则无法从stash记录中pop出以前的进度来合并,两种选择:
① 把当前的进度stash,再pop之前的,两者可以merge
② commit当前进度
5. 可以保存多个进度:
git reflog show refs/stash //用来追踪记录

上图,两次git stash后,出现了两个进度记录,左边第一列是在stash中工作区提交的ID
注意,每次stash恢复后,HEAD都返回之前该分支最后一次commit的位置
6.补充:
(1)关于commit时 --amend参数的使用:
可以在commit以后,用--amend参数修改作者和邮箱,也可以用--amend参数修改提交说明,不会产生新的提交
(2)关于alias的使用:
可以配置别名,方法如下:
git config --global alias.st "status -s"
git config --global alias.ci "commit"
....
之后就可以使用st代替status -s,ci代替commit了
浙公网安备 33010602011771号