git回滚和重置的区别

384 阅读3分钟

前言

git仓库作为代码托管的工具,经常在我们工作中使用,经常有人问我,怎么去撤回一些不好的提交?于是我打算写一篇关于用git如何撤回不好的提交。

前方高能!!!前方高能!!!

小明今天维护一份代码写注释的时候愤怒写下了一些骂人的话(xxx领导是傻逼!),提交了代码忘记删掉注释,小明马上一个激灵回想起来自己没有删掉注释!!小明很害怕,但是冷静下来,他准备撤回提交的代码。请问小明会采取那种方式回滚代码?

option A: 小明选择进行代码回滚

git revert <commit hash> // 回滚某次代码提交

结果:小明的注释还是被另一个同事看到了,并且被同事告发了,第二天小明回来收拾包袱走人。

分析:小明的代码明明回滚了为什么还是被另一个同事看到呢?首先“回滚”代码确实能把我们某个提交的代码内容删掉,但是!!它会生成一个新的节点,显示你在这个节点进行了回滚的操作,那么其实小明注释提交和回滚的节点都会被看到,细心的同事要是看下小明的提交的内容就会发现他一个提交记录新增了“xxx领导是傻逼!”,下一个提交记录了显示小明删掉了这个“xxx领导是傻逼!”(回滚=删掉代码)

operation_1.jpg

option B: 小明决定重置代码

git reset --<模式> <commit hash> // 将分支重置到某个节点
git push -f origin <branch name> // 强制推送本地分支到远程分支 

reset有三种模式,分别是hard(强行合并)、soft(软合并)、mixed(混合合并),mixed是默认的模式。

小明决定重置分支到他提交代码的前一个节点,我们暂时称节点A

小明决定用hard模式,操作完他发现操作是回到提交代码之前的节点A了,但是!!除了注释的话他还有其他代码都在那一个提交里面,这下子本地仓库完全没有了他的这个提交。因为hard模式会强制丢弃节点A后面提交节点的所有改动,小明痛哭!(虽然节点消失了,但是可以通过git reflog看到删除了commit的记录找回)

小明决定用soft模式,操作完他发现操作回到提交代码之前的节点A了,并且后续节点里面改动的文件都在暂存区里面能看到。小明决定把注释的话删掉,然后重新提交。小明看了看提交的节点和节点记录的改动很满意。

小明决定用mixed模式,操作完他发现操作回到提交代码之前的节点A了,并且后续节点里面改动的文件都在工作区里面能看到。小明决定把注释的话删掉,然后重新提交。小明看了看提交的节点和节点记录的改动很满意。

option C: 小明决定采用经典的鸵鸟算法!

温馨提示!!!温馨提示!!!

git reset 和强推分支这种操作可能会影响其他协作者,因此在进行之前最好与团队成员进行沟通。