撤销git commit 的 git reset
soft模式
git reset --soft HEAD^
采用这种模式,git不会清除stage区和工作区,因此,git status时就显示了stage区相对于second commit的变化。
reset模式, mixed,即其默认的模式
git reset HEAD^
git将提交回滚到了second commit, 同时清空了暂存区(也称stage或index,下文用stage代替暂存区),但是工作区仍然保留,所以git status时,显示时当前工作区相对于second commit的变动。使用这种模式不用害怕吧,他并不会清除你的工作区,你在third commit做的任何操作都不会消失。、
hard模式
git reset --hard HEAD^
这时工作区,stage区都是干净的,然而readme.txt则残忍的回到了第二次提交是的状态。这说明了啥,采用这种模式,git会用second commit 的内容覆盖stage区和工作区(清空了暂存区和暂存区),因此所有的内容都回到了second commit的状态。
如果已经推送到远程上游分支
假设你有3个commit如下:
commit 3 commit 2 commit 1
其中最后一次提交commit 3是错误的,那么可以执行:
git reset --hard HEAD~1
你会发现,HEAD is now at commit 2。
然后再使用git push --force将本次变更强行推送至服务器。这样在服务器上的最后一次错误提交也彻底消失了。
值得注意的是,这类操作比较比较危险,例如:在你的commit 3之后别人又提交了新的commit 4,那在你强制推送之后,那位仁兄的commit 4也跟着一起消失了。