7. Git进阶之撤销改动(三种情况)

# 关于撤销


根据代码的状态,可以使用git status查看,有三种情况:

  • 本地修改,未git add
  • 修改完git add,未git commit
  • 修改完git commit

1. 本地修改,未git add

如果在工作区进行了修改(本地文件、文件夹),改动完还没有使用git add命令添加到暂存区的

可以使用git checkout --命令:

git checkout -- [file]

作用:让这个文件回到最近一次git commitgit add时的状态

2. 修改完git add,未git commit

如果在工作区修改完后并使用了git add添加到暂存区。但是还没有使用git commit提交到版本库的

可以使用git reset命令,该命令不止可以用在版本回退,也可以用来撤销暂存区。用法:

git reset HEAD [file]

作用:把暂存区的修改撤销掉(unstage),重新放回工作区。

其中HEAD指向当前分支最新的提交commit

随后使用git status查看,其状态与情况1一样,此时可以再使用git checkout --命令撤销工作区的修改。

另一种情况是要把git add进暂存区的文件移出暂存区,使其变成未跟踪状态,可以使用git rm命令。用法:

git rm --cached [file]	#移出暂存区

作用:把暂存区的文件移出,使其变成未跟踪状态。

3. 修改完git commit,未git push

如果在工作区做了修改,并且使用了git add 和 git commit提交到了版本库(本地仓库),到这一步进行撤销就是常提到的:版本回退

由于前面分析了代码可能有多个状态,所以可以根据自己想要保留的代码状态选择回退的方式,可以撤销commit保留到暂存区,也可以保留到工作区,甚至连工作区都一起回退掉。

有三种回退方式:

  1. git reset --hard HEAD^
    

    往前回退一个版本,回退完了后工作区就是上一个版本的代码了,并且是clean的。连工作区也一起回退

  2. git reset --soft HEAD^
    

    往前回退一个版本,并且将这次错误的提交的代码改动,放在暂存区里。回退到git commit之前,修改保留到git add。

  3. git reset --mixed HEAD^ #(和不带参数是一样的)
    

    往前回退一个版本,并且将这次错误的提交的代码改动,放在工作区里。回退到git add之前,修改保留在工作区

eg

在某次commit后发现有个文件的宏没有打开,需要做简单的修改。
使用git reset --soft HEAD^将这次commit撤销,并且把commit的内容保留到git add时的状态,也就是暂存区。如下图:
7. Git进阶之撤销改动(三种情况)_第1张图片
可以看到使用回退命令前有2次commit,使用完变成了1次commit,说明撤销掉了一次。
并且在回退前使用git status查看代码状态时,暂存区的内容是空的。回退后暂存区多了一堆绿色的modified文件,说明撤销的内容保留在了暂存区,也就是git add时的状态。

关于查看各个阶段代码的改动详情可以查看这篇文章6. Git进阶之撤销与修改(点击跳转)的后半部分。

你可能感兴趣的:(git,git,github)