如何高效撤销Git管理的文件在各种状态下的更改

一、背景

  企业中我们一般采用分布式版本管理工具git来进行版本管理,在团队协作的过程中,我们难免会遇到误操作,需要撤销更改的情况,那么我们怎么高效的进行撤销修改呢?对于还未提交到暂存区的代码怎么高效撤销更改呢?对于已经提交到暂存区的代码,怎么取消add操作?对于已经提交到本地仓库,还没有提交到远程仓库的代码,怎么进行高效撤销更改呢?还有对于已经提交到远程仓库的代码,如何进行高效的撤销更改呢?那我们本文就来一一解决这些棘手的问题!

二、各种状态高效撤销方案

  1. 文件还未提交到暂存区,只是在工作目录中修改了,想要撤销

    git checkout [--] file-name (撤销单个文件修改)
    git checkout [--] . (撤销当前工作空间中所有文件的修改)
  2. 文件已经add到暂存区,但还没有提交到本地仓库,想要撤销(即取消add操作)
    git reset [HEAD] file-name (撤销暂存区中的单个文件)
    git reset [HEAD] . (撤销当前暂存区中的所有内容)
  3. 文件已经提交到本地仓库,但还没有push到远程仓库,想要撤销

    git log (查看并记录下要回滚到的commitId)
    git reset [--soft | --mixed |--hard] commitId (回退版本)

      注:git reset 默认是 --mixed 模式,即 git reset --mixed 等价于 git reset.

        --soft : 会保留工作区间以及暂存区index的提交,只是把git commit回退到某个版本,如还需提交,直接commit即可。

        --mixed : 会在工作区保留源码,只是将git commit和暂存区index回退到某个版本。

        --hard : 源码以及暂存区和git commit都回退到某个版本。

  4. 文件已经提交到远程仓库,想要撤销

    git log (查看并记录下要回滚到的commitId)
    git reset --hard commitId (回退版本)
    git push -f origin branch-name


    git revert commitId(回退版本)
    git push origin branch-name

   注: reset和revert有着本质的区别,reset直接删除了指定的commit,而revert是用一次新的commit来覆盖要回滚的commit.

      reset 是在正常的commit历史中,删除了指定的commit,这时 HEAD 是向后移动了,而 revert 是在正常的commit历史中再commit一次,只不过是反向提交,他的 HEAD 是一直向前的.

        如果在日后现有分支和历史分支需要合并的时候,reset 恢复部分的代码依然会出现在历史分支里.但是revert 方向提交的commit 并不会出现在历史分支里.  

三、总结

  通过本文我们就知道如何对不同状态的git管理的文件进行撤销修改的操作,这样即使我们不小心操作了什么东西,我们也能很快的进行回滚,就是要做高效的程序猿~


    感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
    如果您觉得阅读本文对您有帮助,请点一下左下角“推荐”按钮,您的将是我最大的写作动力!另外您也可以选择关注我,可以很方便找到我!
    本文版权归作者和博客园共有,来源网址:http://www.cnblogs.com/hafiz 欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!

个人微信公众号 博主微信号
posted @ 2017-12-29 16:16  阿豪聊干货  阅读(1235)  评论(0编辑  收藏  举报