频道栏目
首页 > 系统 > 其他 > 正文
gitreset&revert代码回滚
2015-08-19 10:02:45         来源:all for one,one for all  
收藏   我要投稿

git revert: 回退某次修改,并且自动commit修改,git log中添加新的revert日志
假设当前有3个commit,git log如下:

commit3:  add test3.c
commit2:  add test2.c
commit1:  add test1.c

执行 git revert HEAD~1之后,会提示提交信息,提交后git log如下:

commit4:  Reverts “test2.c”
commit3:  test3.c
commit2:  test2.c
commit1:  test1.c

执行完后,test2.c被删除了(回滚),运行git status,无任何变化(因为已经自动commit了)。

git reset:回退某次修改,根据 –mixed, –soft, –hard 提交修改(add & commit) ,git log中会”删除”日志
同样有3个commit,git log如下:

commit3:  add test3.c
commit2:  add test2.c
commit1:  add test1.c

执行 git reset HEAD~1 (默认–mixed)之后,再次看git log,如下:

commit2:  test2.c
commit1:  test1.c

执行完后,commit3的log信息被删除了;但是test3.c还在本地缓存区,运行git status,可以看见提示test3.c,可以用git add 包含该文件;

若执行git reset –hard HEAD~1,log为:

commit2:  test2.c
commit1:  test1.c

执行完后,test3.c也被删除了,查看git status,无任何变化(因为暂存区,工作区全部用指定提交版本的目录树替换掉)。

这里写图片描述<喎"https://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxjb2RlIGNsYXNzPQ=="hljs avrasm">其实reset命令有两种用法:

git reset [-q] [commit] [--] 
git reset [--soft | --mixed | --hard | --merge | --keep] [-q] []

第一种用法是不会重置引用的,即不会修改master文件。只是用某一次提交的文件提交暂存区的文件

第二种用法不使用 则会重置引用,并且参数不同决定是否覆盖暂存区和工作区:

--hard参数会执行上图中1,2,3 全部动作,即暂存区,工作区全部用指定提交版本的目录树替换掉

--soft 参数只执行1, 不进行暂存区和工作区的覆盖

--mixed或不使用参数,执行1,2覆盖暂存区,但不覆盖工作区

如果执行完git reset发现有问题,又想恢复之前做的修改,但是此时git log已经找不到那个commit信息了怎么办?(因为 git reset 会 “删除”git log中的信息)

这时我们可以使用 git reflog 查看所有的变更记录,如下:

$ git reflog
22f8aae HEAD@{0}: pull: Merge made by the 'recursive' strategy.
4e79a0b HEAD@{1}: reset: moving to HEAD^
22f8aae HEAD@{2}: reset: moving to 22f8aae

此时恢复某次修改只需要执行:

git reset --hard 22f8aae
点击复制链接 与好友分享!回本站首页
相关TAG标签 代码
上一篇:线程同步与互斥:POSIX无名信号量
下一篇:关于压缩软件gzip和xz的简单对比
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站