如何高效撤销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管理的文件进行撤销修改的操作,这样即使我们不小心操作了什么东西,我们也能很快的进行回滚,就是要做高效的程序猿~

posted @ 2017-12-29 16:16  阿豪聊干货  阅读(1542)  评论(0编辑  收藏  举报