在git的一般使用中,如果发现错误的将不想提交的文件add进入index之后,想回退取消,则可以使用命令:git reset HEAD <file>...,同时git add完毕之后,git也会做相应的提示,比如:

引用

# Changes to be committed:

#   (use "git reset HEAD<file>..." to unstage)

#

# new file:   Test.scala

git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]:将当前的分支重设(reset)到指定的<commit>或者HEAD(默认,如果不显示指定commit,默认是HEAD,即最新的一次提交),并且根据[mode]有可能更新index和working directory。

下面列出一些git reset的典型的应用场景:

A) 回滚add操纵

引用

$ edit                                   (1)

$ git add frotz.c filfre.c

$ mailx                                  (2)

$ git reset                              (3)

$ git pull git://info.example.com/ nitfol (4)

(1) 编辑文件frotz.c, filfre.c,做了些更改,并把更改添加到了index

(2) 查看邮件,发现某人要你pull,有一些改变需要你merge下来

(3) 然而,你已经把index搞乱了,因为index同HEAD commit不匹配了,但是你知道,即将pull的东西不会影响已经修改的frotz.c和filfre.c,因此你可以revert这两个文件的改变。revert后,那些改变应该依旧在working directory中,因此执行git reset。

(4) 然后,执行了pull之后,自动merge,frotz.c和filfre.c这些改变依然在working directory中。

B) 回滚最近一次commit

引用

$ git commit ...

$ git reset --soft HEAD^     (1)

$ edit                       (2)

$ git commit -a -c ORIG_HEAD (3)

(1) 当提交了之后,你又发现代码没有提交完整,或者你想重新编辑一下提交的comment,执行git reset --soft HEAD^,让working tree还跟reset之前一样,不作任何改变。

HEAD^指向HEAD之前最近的一次commit。

(2) 对working tree下的文件做修改

(3) 然后使用reset之前那次commit的注释、作者、日期等信息重新提交。注意,当执行git reset命令时,git会把老的HEAD拷贝到文件.git/ORIG_HEAD中,在命令中可以使用ORIG_HEAD引用这个commit。commit 命令中 -a 参数的意思是告诉git,自动把所有修改的和删除的文件都放进stage area,未被git跟踪的新建的文件不受影响。commit命令中-c <commit> 或者 -C <commit>意思是拿已经提交的commit对象中的信息(作者,提交者,注释,时间戳等)提交,那么这条commit命令的意思就非常清晰了,把所有更改的文件加入stage area,并使用上次的提交信息重新提交。

C) 回滚最近几次commit,并把这几次commit放到叫做topic的branch上去。

引用

$ git branch topic/wip    (1)

$ git reset --hard HEAD~3  (2)

$ git checkout topic/wip   (3)

(1) 你已经提交了一些commit,但是此时发现这些commit还不够成熟,不能进入master分支,但你希望在新的branch上润色这些commit改动。因此执行了git branch命令在当前的HEAD上建立了新的叫做 topic/wip的分支。

(2) 然后回滚master branch上的最近三次提交。HEAD~3指向当前HEAD-3个commit的commit,git reset --hard HEAD~3即删除最近的三个commit(删除HEAD, HEAD^, HEAD~2),将HEAD指向HEAD~3。

D) 永久删除最后几个commit

引用

$ git commit ...

$ git reset --hard HEAD~3   (1)

(1) 最后三个commit(即HEAD, HEAD^和HEAD~2)提交有问题,你想永久删除这三个commit。

E) 回滚merge和pull操作

引用

$ git pull                        (1)

Auto-merging nitfol

CONFLICT (content): Merge conflict innitfol

Automatic merge failed; fix conflicts andthen commit the result.

$ git reset --hard                (2)

$ git pull . topic/branch         (3)

Updating from 41223... to 13134...

Fast-forward

$ git reset --hard ORIG_HEAD      (4)

(1) 从origin拉下来一些更新,但是产生了很多冲突,你暂时没有这么多时间去解决这些冲突,因此你决定稍候有空的时候再重新pull。

(2) 由于pull操作产生了冲突,因此所有pull下来的改变尚未提交,仍然再stage area中,这种情况下git reset --hard 与 git reset --hard HEAD意思相同,即都是清除index和working tree中被搞乱的东西。

(3) 将topic/branch合并到当前的branch,这次没有产生冲突,并且合并后的更改自动提交。

(4) 但是此时你又发现将topic/branch合并过来为时尚早,因此决定退滚merge,执行git reset --hard ORIG_HEAD回滚刚才的pull/merge操作。说明:前面讲过,执行git reset时,git会把reset之前的HEAD放入.git/ORIG_HEAD文件中,命令行中使用ORIG_HEAD引用这个commit。同样的,执行pull和merge操作时,git都会把执行操作前的HEAD放入ORIG_HEAD中,以防回滚操作。

F) 在被污染的working tree中回滚merge或者pull

引用

$ git pull                        (1)

Auto-merging nitfol

Merge made by recursive.

nitfol               |   20 +++++----

...

$ git reset --merge ORIG_HEAD     (2)

(1) 即便你已经在本地更改了一些你的working tree,你也可安全的git pull,前提是你知道将要pull的内容不会覆盖你的working tree中的内容。

(2) git pull完后,你发现这次pull下来的修改不满意,想要回滚到pull之前的状态,从前面的介绍知道,我们可以执行git reset --hard ORIG_HEAD,但是这个命令有个副作用就是清空你的working tree,即丢弃你的本地未add的那些改变。为了避免丢弃working tree中的内容,可以使用git reset --merge ORIG_HEAD,注意其中的--hard 换成了 --merge,这样就可以避免在回滚时清除working tree。

G) 被中断的工作流程

在实际开发中经常出现这样的情形:你正在开发一个大的feature,此时来了一个紧急的bug需要修复,但是目前在working tree中的内容还没有成型,还不足以commit,但是你又必须切换的另外的branch去fix bug。请看下面的例子

引用

$ git checkout feature ;# you were workingin "feature" branch and

$ work work work       ;#got interrupted

$ git commit -a -m "snapshot WIP"                (1)

$ git checkout master

$ fix fix fix

$ git commit ;# commit with real log

$ git checkout feature

$ git reset --soft HEAD^ ;# go back to WIPstate  (2)

$ git reset                                     (3)

(1) 这次属于临时提交,因此随便添加一个临时注释即可。

(2) 这次reset删除了WIP commit,并且把working tree设置成提交WIP快照之前的状态。

(3) 此时,在index中依然遗留着“snapshot WIP”提交时所做的uncommit changes,git reset将会清理index成为尚未提交"snapshot WIP"时的状态便于接下来继续工作。

(H) Reset单独的一个文件

假设你已经添加了一个文件进入index,但是而后又不打算把这个文件提交,此时可以使用git reset把这个文件从index中去除。

引用

$ git reset -- frotz.c                     (1)

$ git commit -m "Commit files inindex"     (2)

$ git add frotz.c                          (3)

(1) 把文件frotz.c从index中去除,

(2) 把index中的文件提交

(3) 再次把frotz.c加入index

(I) 保留working tree并丢弃一些之前的commit

假设你正在编辑一些文件,并且已经提交,接着继续工作,但是现在你发现当前在working tree中的内容应该属于另一个branch,与这之前的commit没有什么关系。此时,你可以开启一个新的branch,并且保留着working tree中的内容。

引用

$ git tag start

$ git checkout -b branch1

$ edit

$ git commit ...                          (1)

$ edit

$ git checkout -b branch2                  (2)

$ git reset --keep start                   (3)

(1) 这次是把在branch1中的改变提交了。

(2) 此时发现,之前的提交不属于这个branch,此时你新建了branch2,并切换到了branch2上。

(3) 此时你可以用reset --keep把在start之后的commit清除掉,但是保持working tree不变。

git reset(回退add操作)相关推荐

  1. git reset 回退以前某个版本_远程仓库版本回退方法--Git(二)

    1 简介 最近在使用git时遇到了远程分支需要版本回滚的情况,于是做了一下研究,写下这篇博客. 2 问题 如果提交了一个错误的版本,怎么回退版本? 如果提交了一个错误的版本到远程分支,怎么回退远程分支 ...

  2. git 如何取消add操作

    可以直接使用命令    git reset HEAD 这个是整体回到上次一次操作 绿字变红字(撤销add) 如果是某个文件回滚到上一次操作:  git reset HEAD  文件名 红字变无 (撤销 ...

  3. 使用git reset回退版本

    1.git log命令介绍 在介绍版本回退之前先介绍下如何git log命令,可以查看我们的提交历史记录. git log 多页时,空格向下翻页,b向上翻页,q退出 git log --pretty= ...

  4. Git之撤销add操作

    1 问题 git add file或者git add folder错了 2 解决办法 git reset HEAD 如果后面什么都不跟的话 就是上一次add 里面的全部撤销了 git reset HE ...

  5. git 回滚 add 操作_炫技!git 优雅回滚一次错误的合并操作!

    点击蓝色小字关注! 关注一下你就不会有bug!合并操作 相对于常规的 commit,当使用 git merge 合并两个分支的时候,你会得到一个新的 merge commit. 当我们 git sho ...

  6. 一文搞懂本地和远程分支代码回退git reset

    最近痴迷于git flow,打算对之前大部分人一提起就害怕的代码回退--git reset来进行一个实践,也算是一篇操作总结,想直接看结论的可以拉到文末,如有纰漏,欢迎大佬们指正补充. git进阶之路 ...

  7. Git 版本回退和修改撤销

    文章目录 前言 一.版本回退 (撤销commit修改) 版本查看 临近版本回退 指定版本回退 git reset的模式 二.修改撤销 在工作区的修改撤销(撤销直接修改) 在暂存区的修改撤销(撤销add ...

  8. git reset 的三种模式的使用场景

    一.前提 参考:建议先阅读:Git Reset 三种模式 这篇文章只是我的的一个笔记 二.三种模式 git reset --soft git reset --mixed git reset --har ...

  9. git checkout和git reset的一些区别以及配置git简写命令

    一.背景 在调试代码的时候,每次都要通过git上传到服务器调试,实在是一件很麻烦的事情.所以对于一些微小的改动,我就直接在服务器上修改.等调试成功之后,用git reset再回退到之前的版本,后来经过 ...

最新文章

  1. c4d教程-太空火车站场景创作视频教程Skillshare – Create A Space Train Scene With Cinema 4D Redshift Render
  2. eva每一集片尾曲是谁唱的_【跪求】EVA 18集片尾曲的歌手名,考验大家的听力~...
  3. Android性能优化 - 内存优化
  4. ASP.NET中Request.ApplicationPath、Request.FilePath、Request.Path、.Request.MapPath、Server.MapPath的区别...
  5. 跟着石头哥哥学cocos2d-x(四)--cocos2dx中的动画以及TexturePacker使用
  6. 我用python远程探查女友每天的网页访问记录,她不愧是成年人!
  7. python数组取数_python 取数组
  8. Bootstrap3 带悬停效果的表格样式
  9. 简书 c语言 指针,C语言-指针
  10. 上海黑马JAVA30期_2018年4月最新黑马Javaee第297期
  11. 企业内网安全十大防护策略
  12. 确认过眼神,你是要来百度AI开发者实战营深圳站的人
  13. 华为鸿蒙11什么时候发布,原创 华为EMUI11正式发布,今年12月可升级为鸿蒙OS2.0国产操作系统...
  14. win2003服务器性能工具,win2003服务器安全一键配置工具
  15. loaders之val-loader
  16. linux反复出现文件系统损坏,Linux日常维护之文件系统损坏后的修复
  17. 智力题------扔硬币吃苹果
  18. python开源软件排行榜_10大Python开源项目推荐(Github平均star2135)
  19. 王建然之第三类永动机
  20. 【论文阅读】OUTRAGEOUSLY LARGE NEURAL NETWORKS: THE SPARSELY-GATED MIXTURE-OF-EXPERTS LAYER

热门文章

  1. 如何获取UnrealEngine虚幻引擎的WebUI插件
  2. 《云端软件平台》运行机制浅析
  3. 什么是304不锈钢?
  4. php lotus notes,Lotus Notes 和 Domino Web Access 的比较
  5. 安装最好用的计算机软件,8个职场人必装的电脑软件,用过以后就离不开了,太好用!...
  6. 多张图片合成一张的ps技术
  7. 《中国游戏产业报告》出炉,爱加密呼吁重视游戏安全
  8. 寻仙获取目录服务器信息失败,〖寻仙〗常见游戏问题解决办法!
  9. java 操作excel的类_探究下Java操作Excel的几类工具
  10. weboffice功能的实现:在线编辑,保护文档部分编辑,显示,下载