git 情景模式 - 撤销尚未 push 的 commit
概述
在本文中,你是一个粗心大意的人,经常将事情搞砸,所以你不得不熟练掌握那些可以可以随时撤销你所做的那些糟糕的修改。跟随本文,看看你都干了些啥。
注①:本文适用场景: commit 并未 push 到 git 服务器!
注②:情景模式需要仔细看,毕竟命令和情景模式是高度相关的。
注③:commit 和 ‘提交’表达相同的含义可能会混用。
撤销 commit 保留改动
情景再现:你刚刚使用 git commit -m 'a good commit'
命令提交了一个 commit,但是并未 push 到 git 服务器,这时你突然发现,这个改动有一些小错误,你希望撤销本次提交,但是你想保留这个 commit 相关的改动,因为这个 commit 包含了多个文件的改动,但是只有其中两个文件需要重新修改,你并不希望从头再来,你希望的是回到 git commit
命令执行之前,然后修改那两个文件,重新提交。
当然这难不倒你,因为你的粗心大意,这种事情已经无数次发生在你身上,于是你在控制台熟练的敲下了:
git reset --soft HEAD~1
画外音:也可以使用下面的命令,但是某些 shell 中 ^
可能是保留符号,因此推荐使用上面的那种方式。
git reset --soft HEAD^
在 windows 平台下推荐使用 git reset HEAD~1
。
画外音:有同学可能说这不是多此一举吗?直接改动,再提交一个 commit 就好了啊!事实上每个 git 提交应该是深思熟虑的,且都是有意义的,胡乱提交会给维护的人带来不必要的麻烦,一个漂亮的 git 历史能让领导觉得你是一个靠谱的人。
另外注意这里的 --soft
选项,该选项表示要保留改动并且本次 commit 相关的 git add 都保留。因此 git reset --soft HEAD~1
命令执行后相当于你刚刚没有执行 git commit
命令,其他的啥也不变。
关于 HEAD
HEAD 可以看成是指向当前分支最后一个 commit 的指针,看下图:
HEAD 指向最后一个 commit,我们需要撤销 commit3,因此我们需要回到 commit2, 而 HEAD~1
指向上一个 commit,因此正是 commit2。HEAD~ 后面的数字表示回到 HEAD 前面第几个 commit。
所以如果你想撤销最近两次的 commit,你可以:
git reset --soft HEAD~2
注:再次提醒,请注意你想要撤销的 commit 不能已经被 push 到 git 服务端。
git reset --soft
命令的实际效果是将 commit 相关的改动从本地仓库撤回到 index 区域。
撤销 commit 保留文件同时撤销 commit 相关的 git add
这个只需要省略 --soft
即可。
git reset HEAD~1
git reset
命令的实际效果是将 commit 相关的改动从本地仓库直接撤回到 workspace(当前工作区域)。但是改动仍然是保留的,如果你希望重新提交,需要先执行 git add,然后执行 git commit。
撤销 commit 并撤销本次提交相关的所有改动
情景再现:你刚刚提交了一个 commit,正当你准备 push 的时候,你突然慧眼发现这个 commit 完全就是一个彻头彻尾的错误,或者另外一种情况,你的领导突然驾临告诉你那个 commit 相关的需求不做了,于是你只得:
git reset --hard HEAD~1
该命令会撤销本次 commit,本次 commit 相关的所有改动都被撤销,所以要谨慎哦。如果本次 commit 之后你还有一些尚未提交的改动也会被一起撤销。
温馨提示:反馈需要登录