git reset

git 的重置操作

有三种模式:hard、mixed(默认)、soft

1. hard 用法

hard会重置stage区工作区,和移动代码库上HEAD 和branch的指针所指向的位置,所有的都没了(干净了),如果工作区或stage区有修改,则全部舍弃了

//重置到与代码库HEAD所指向的commit处(一般都是最新的commit)
git reset --hard HEAD //重置到与代码库HEAD的上一个commit处(即第二个,从上往下数)
git reset --hard HEAD^ //重置到与代码库HEAD的上两个commit处(即第三个,从上往下数)
git reset --hard HEAD^^ //重置到与代码库HEAD的上N个commit处
git reset --hard HEAD~N

ps:实际上还是有的,如果你记得之前的commit-id ,还可以checkout过去(checkout游离)

也就是说hard在代码库的操作是移动了head branch 所指向的位置,而不是删除了commit

2. soft 用法

soft 不会重置stage区和工作区,并将由于移动HEAD 和 Branch 带来的差异放进stage区

//重置到与代码库HEAD所指向的commit处(一般都是最新的commit)
git reset --soft HEAD //重置到与代码库HEAD的上一个commit处(即第二个,从上往下数)
git reset --soft HEAD^ //重置到与代码库HEAD的上两个commit处(即第三个,从上往下数)
git reset --soft HEAD^^ //重置到与代码库HEAD的上N个commit处
git reset --soft HEAD~N

比如

当前暂存区和工作区的内容为

➜  reset_test git:(master) ✗ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage) new file: d.txt 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: c.txt

执行

➜  reset_test git:(master) ✗ git reset --soft  HEAD^

后,暂存区和工作区的内容为

➜  reset_test git:(master) ✗ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage) new file: c.txt
new file: d.txt 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: c.txt

可以看到上一个commit的内容回到了暂存区内,这样就相当于可以修改这个commit的内容了

3. mixed (即默认) 用法

不跟参数,本身就是使用mixed

比如:

➜  reset_test git:(master) ✗ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage) modified: d.txt 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: c.txt

git log 为

9a4ab25 (HEAD -> master) commit c
72b36c9 commit b
a3ce6eb commit a
9b4b913 第一次提交

现在回滚到 commit b

git reset HEAD^

可以看到日志变为

72b36c9 (HEAD -> master) commit b
a3ce6eb commit a
9b4b913 第一次提交

在 git status 看一下

➜  reset_test git:(master) ✗ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed) c.txt
d.txt

将代码库 暂存区 的修改及工作区的修改一并打包放入了暂存区;暂存区被清空

reset 模式总结

--hard : 代码库代码回退到某个commit,暂存区和工作区内容丢弃

--soft: 代码库代码回退到某个commit,回退的修改和原暂存区的修改一起放入暂存区,工作区修改保留

--mixed: 代码库代码回退到某个commit,回退的修改和原暂存区的修改加上工作区的修改一并放入工作区

由此可见,mixed作为默认是很科学的

reset总结

reset 的本质:移动 HEAD 以及它所指向的 branch

实质上,reset 这个指令虽然可以用来撤销 commit ,但它的实质行为并不是撤销,而是移动 HEAD ,并且「捎带」上 HEAD 所指向的 branch(如果有的话)。也就是说,reset 这个指令的行为其实和它的字面意思 "reset"(重置)十分相符:它是用来重置 HEAD 以及它所指向的 branch 的位置的

最新文章

  1. [No000096]程序员面试题集【上】
  2. 关于PHP堆栈与列队
  3. Fragment学习笔记
  4. [转]百度MP3音乐API接口及应用
  5. Could not find action or result
  6. ECC校验原理以及在Nand Flash中的应用
  7. 项目中logger、message错误信息的配置
  8. js冲突怎么解决
  9. 分西瓜(DFS)
  10. Android存储小结
  11. if简单的写法之范围
  12. Python学习记录----语法学习
  13. java中Queue简介
  14. R语言-推荐系统
  15. 曾经进公司面试的C语言有关指针和数组的笔试题
  16. SqlSugar 盲点
  17. 洛谷 P1045 &amp; [NOIP2003普及组] 麦森数
  18. Javascript入门(三)函数
  19. 连接postgres特别消耗cpu资源而引发的PostgreSQL性能优化考虑
  20. R语言中的字符串处理函数

热门文章

  1. RPA应用场景-营业收入核对
  2. NC16618 [NOIP2008]排座椅
  3. Mac安装 Scrapy 报错 No local packages or working download links found for incremental&gt;=16.10.1
  4. 如何在Excel/WPS表格中批量查询快递信息?
  5. Dokcer运行Nacos容器自动退出问题
  6. Go 接口:深入内部原理
  7. 技术分享 | 将GreatSQL添加到系统systemd服务
  8. elasticsearch查询之keyword字段的查询相关度评分控制
  9. 编译器优化:何为SLP矢量化
  10. 《笨办法学Python3 》入坑必备,并不是真笨学!!!