0010-Git不完全操作指南之本地操作6——reset

15 阅读2分钟

概念

git变更撤销操作也有多种方式,我们先来看看第一种reset

git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。

图示

如下图,我们想要撤销C2变更,回到C1变更。

reset1

执行以下命令:

git reset HEAD^

reset2

此时,我们的main分支就回退回了C1变更处,就像从来没有提交过C2一样。

虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!

为了撤销更改并分享给别人,我们需要使用 git revert

同样是上面的示例,如果使用revert的话:

git revert HEAD

revert1

奇怪!在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。

revert 之后就可以把你的更改推送到远程仓库与别人分享啦。

因此,我们如果在本地编辑代码之后,如果仅仅只是commit没有push到远程仓库,可以使用reset,如果已经推送到远程仓库了就使用revert

常用命令

# 重置当前分支到上一次提交的状态,即我当前写的代码不要了,要回到上一次提交的状态
# 其中--hard代表硬重置,即你新增的文件会被删除,删除的文件会被恢复,修改的文件会被还原
git reset --hard

# 撤回上一次提交,并保留文件
# 这里使用的是软重置,也就是所有的更改的文件,不会被直接重置,而是从提交记录中将上一次
# 提交记录删除掉,恢复到没有提交前的样子,你可以重新提交
git reset --soft HEAD^

# 移除某几次提交的修改
git revert C1 C2 C3
# 移除某几次连续提交的修改
# 使用...将需要移除的提交记录起点哈希与终点哈希连接起来
git revert C1...C3

# 如果我们要移除的提交记录是merge操作,那么上述方法是不行的,我们需要增加一个-m参数
# 后面跟的哈希值是主线的哈希值,非主线的代码会被还原或移除
git revert -m C1