![546bff5dc27315347c274292f9fd7f9c.png](https://i-blog.csdnimg.cn/blog_migrate/3efbcce16d6c6a7fdc32d975218abb09.png)
方便记录问题本文用gitHub客户端对比两者区别
git reset
![cc53a0a3d095268cd111de9c7bfc78fc.png](https://i-blog.csdnimg.cn/blog_migrate/9da80cfda1acbb700388a68420c39a8b.jpeg)
假如最晚提交的代码已经被推送到远端 而你又想把这次提交的代码从远端上给删掉连记录也给抹掉 使用
git reset 粘贴过来的SHA【也就是上一次提交的SHA】 --hard
注意!!! SHA是指【最早提交】的SHA 如图所示
![02415cecf0f5bac6d5b6bb9dc9cd8676.png](https://i-blog.csdnimg.cn/blog_migrate/777e9b45e80d2d0efbe6658cc1e19753.jpeg)
在GUI中输入 git reset 926b8a9905399e3dca639b3383cdf8e1578885ad --hard 最晚提交的那次代码就会被抹除【如果前面有N次提交,n那么这N次提交都会被抹除】
![ffbcc8a7aa1e5b8a3519a918a63b46e8.png](https://i-blog.csdnimg.cn/blog_migrate/707ea93b9e21bd087943b195e4521768.png)
![016210043cf6c2d74fbbee30be346ad7.png](https://i-blog.csdnimg.cn/blog_migrate/6f9a3c02c8ca74ef5a6ac4b829349750.jpeg)
这时候远端会提示拉去分支 因为你把本地的【最晚提交】的这次代码给抹掉了 落后于远端一次提交 他就会提示你拉去远端分支 如果你点击了Fetch origin 代码又会回到【最晚提交】的这次记录
![232332891fd70d69b883e74b6c516f38.png](https://i-blog.csdnimg.cn/blog_migrate/dd2852c51b47caf3b96916b4a4174097.jpeg)
回到正题
如果你直接在GUI中输入 git push origin 【分支名】 git 会提示你 更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支。
![fae0c120e2c1b3f1f6520404b97159c9.png](https://i-blog.csdnimg.cn/blog_migrate/8c6ee4910e2b2c419257af3ef157fb8e.jpeg)
好吧,我的分支确实落后于远程的develop分支。我需要--force
即 git push origin 【分支名】 --force
![aa3784e4872170fd74aee5b29fabe320.png](https://i-blog.csdnimg.cn/blog_migrate/d36ead43be2342d806a01a3d99ba5a25.jpeg)
这样 代码就回退到最早提交的那次了
--hard的作用
![a1203fb92fa38ba921a66f611e058388.png](https://i-blog.csdnimg.cn/blog_migrate/e9b02dffc8af7ba172d9b6e264577ca1.jpeg)
![540b9729408be9db58a2266727e06984.png](https://i-blog.csdnimg.cn/blog_migrate/63a60a83e6e89bfa790b933411bfef76.jpeg)
简单的来说就是 git reset SHA 不加 --hard时 之前的代码【SHA 指逻辑修改时的SHA】回退过来还能找到 只是提交记录没有了
加上 ---hard时 提交的代码和记录都会被抹去
例如 不加--hard
![ff0d39b9798f68b3d9b19ed76709d6de.png](https://i-blog.csdnimg.cn/blog_migrate/08567a9eac9083a31e9aba174e36c450.png)
![89f7c80bfb597b1173345a8351956aa0.png](https://i-blog.csdnimg.cn/blog_migrate/901f5c637bc86224ff5d9700bf92577c.jpeg)
总结 如果代码已经被推送到远端想要抹去记录
git reset SHA[抹去提交代码之后的SHA] --hard [清除本地记录]
git push origin 【分支名】 --force [推送到远端]
git revert 与git reset的区别
git revert 后多出一条commit ,提醒同事,这里有回撤操作,只能撤回最新的提交
git reset 直接把之前 commit 删掉,非git reset --hard的操作是不会删掉修改代码,如果远程已经有之前代码,需要强推 git push origin 【分支名】 --force
注意: 慎用revert !!!
多人协同开发时,get revert 会影响到其他人的代码
举个例子
场景:
现在有两个分支 " dev " 分支和" from-dev-22 "分支
把dev的代码给合并到from-dev-22分支上
![d7273422e4b40893053daaee4774b1ac.png](https://i-blog.csdnimg.cn/blog_migrate/89052237ee170efc9eae450da3a41dc1.jpeg)
而此时因为某些原因,我又不想这么做了,
想给回滚回去,你在dev上用了 revert 回滚代码
![2a5c0a952cf15a1f16eb3d7c21014282.png](https://i-blog.csdnimg.cn/blog_migrate/1d4fa3bd37a82c5c66ffcf3cd08b5b32.jpeg)
按理说,把dev的代码合并到from-dev-22 的提交记录和回滚记录应该在from-dev-22分支上,而现在这个记录在dev分支上面(并且dev上的代码也给修改掉了),这个是我不明白的地方(我觉得根本原因可能还是git-revert这个命令造成的)
假如说此时你的另一个同事也在dev上修改了代码,他的代码就会被全部磨抹除掉(不清楚原因)。
假如这种情况发生之后 那怎么解决呢
![8b1e85cecfe464b59a4b51ec0b13ec06.png](https://i-blog.csdnimg.cn/blog_migrate/725a8d18722fdd9a6c51cd27009cae26.jpeg)
revert this commit
注意,因为前面已经有了多次提交,所以这次revert 会出现在你的本地记录中,你需要在次提交,当然在提交之前,需要看看是否有冲突需要解决
![65ed428d2e2797e22e3881a27abf05bd.png](https://i-blog.csdnimg.cn/blog_migrate/c10fe40a8353943c964a12acb786de9d.jpeg)
那什么时候能用revert呢?
在你自己开发的分支上可以用,revert 会有修改记录,这样不会影响到别人
在公共分支上千万不要用revert !!!
参考:
https://juejin.im/post/5b0e5adc6fb9a009d82e4f20