我可以不吃啊 发表于 昨天 06:51

【git reset & git revert】git后悔药之回滚及撤销操纵(图文详解)

在之前文章中总结了git的根本操纵,git submodules子模块管理《【Git】Git Submodule 介绍(通俗易懂,总结了工作完全够用的 submodule 命令)》,以及如何用sourceTree进行git操纵《【SourceTree】告别复杂操纵!用SourceTree秒懂Git子模块管理》
这篇文章,说说git的回滚及撤销
✅ 媒介

   在利用GIT实现多人合作步伐开发的过程中,我们偶然会出现错误提交的情况,此时我们希望能撤销提交操纵,让步伐回到提交前的样子,本文总结了两种解决方法.
reset:删除直到XXX版本的所有commit(回滚到指定版本)
revert:删除某个XXX版本的commit(删除已提交的某个版本)
    git的版本管理,及HEAD的理解
利用git的每次提交,Git都会主动把它们串成一条时间线,这条时间线就是一个分支。如果没有新建分支,那么只有一条时间线,即只有一个分支,在Git里,这个分支叫主分支,即master分支。有一个HEAD指针指向当前分支(只有一个分支的情况下会指向master,而master是指向最新提交)。每个版本都会有本身的版本信息,如特有的版本号(用hash值表现)、版本名等。如下图,假设只有一个分支:
https://i-blog.csdnimg.cn/direct/a88b2c802ac44a2b96c2cf5cc13b44a6.png
✅ reset(回滚)

git reset 操纵回退到对应的commit-id,它会完成把commit-id之前的所有的所有commit的记载按照对应的模式进行处置惩罚
注意(下面两段话要理解):


[*] commit-id默认就是当前最近的一条commit-id,此时commit的所有记载不会更改,只会更具明命令中的模式对当前工作区与暂存区的修改做对应的操纵
[*] commit-id如果为非最近的一条

[*]那么起首会把 commit-id之后的所有的commit记载所有的改动都按照命令中的模式处置惩罚到暂存区与工作区
[*]再去按照命令中的模式操纵当前的暂存区和工作区的内同

主要命令参数剖析
git reset [--hard | --soft | --mixed(默认值)]
https://i-blog.csdnimg.cn/direct/4f5890a27e8c45cb9f55b95ed45e8733.png
模式(默认为–mixed)


[*]--hard 回退到指定版本,工作区内容删除,暂存区内容删除
[*]--soft 回退到指定版本,工作区内容保留,暂存区内容保留
[*]--mixed 回退到指定版本,工作区内容保留,暂存区内容回退到工作区
https://i-blog.csdnimg.cn/direct/91d4aedd146c418f8bdafdef7c374a34.png
☝️ 提交示例

下面实操,根目录分别创建test1\test2\test3依次提交三次
https://i-blog.csdnimg.cn/direct/7d4ba1a11d634a35a5d6bdb03e9b4fc5.png
☝️ 查看版本号

✌️ cmd查看

git log
https://i-blog.csdnimg.cn/direct/532b35ee543d40469cea7d29f16b626e.png
✌️ git查看

https://i-blog.csdnimg.cn/direct/51f78f5928ec4b39be391187e4a95ecd.png
✌️ sourceTree查看

https://i-blog.csdnimg.cn/direct/1d15798eb8de4e1fa39f5634140f66fc.png
☝️ 回滚版本

✌️ 利用git reset --mixed(默认)

例子中test1.txt的hash值为3bfbf125d290e9fdc91233d2852219cf5ae6ac9b
利用命令行
git reset --mixed 3bfbf125d290e9fdc91233d2852219cf5ae6ac9b
git reset 3bfbf125d290e9fdc91233d2852219cf5ae6ac9b
利用idea界面操纵
https://i-blog.csdnimg.cn/direct/1e6dae1a3012430db374b7c802183935.png
https://i-blog.csdnimg.cn/direct/7d96d4a5210b409f9c825d7fe97d3259.png
回退之后的test2.txt和test3.txt文件还存在,不过在工作区
https://i-blog.csdnimg.cn/direct/8b3f7ee66c774e96a292b522179c0c44.png
✌️ 利用git reset --soft

操纵过程和mixed同理,这里不赘述,直接看结果
https://i-blog.csdnimg.cn/direct/d7aff5fcfc8f4bbd8eb756892ffda7c8.png
✌️ 利用git reset --hard

利用hard之后,两个文件直接被删除了
https://i-blog.csdnimg.cn/direct/f1fe49c48fbc4567b00109137cd7eaf5.png
这是三种回滚方式直观区别
☝️ 更新远程仓库

   远程git仓库依旧存在
https://i-blog.csdnimg.cn/direct/652a28d80bb34504af600708794ff950.png
https://i-blog.csdnimg.cn/direct/99dab6ea050f477e8c64cfc2a75f0d36.png
https://i-blog.csdnimg.cn/direct/764b82fdcb064d4294a181f4d87e69d3.png
   由于当地代码和远程代码不相符 , HEAD指向的版本比远程库的要旧 , 用“git push”会报错,所以要强行提交 , 当地覆盖远程仓库“git push -f”.
https://i-blog.csdnimg.cn/direct/b244e922b26f4ce4bebbe30ee8fa8d3b.png
☝️ 查看仓库

https://i-blog.csdnimg.cn/direct/bb73bf0348cd47b5a0afcc70fb6854d5.png
https://i-blog.csdnimg.cn/direct/441329ae10464fc8b5f6433431cb8439.png
   已回滚到指定版本
✅ revert(撤销)

git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目标。好比,我们commit了三个版本(test1、test2、test3),忽然发现test2不行(如:有bug),想要撤销test2,但又不想影响撤销test3的提交,就可以用 git revert 命令来反做test2,生成新的test4,这个test4里会保留test3的东西,但撤销了test2的东西
https://i-blog.csdnimg.cn/direct/0f28db50bfc14946bc7cefffeacda546.png
适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本背面的版本,记载下这整个版本变更流程,就可以用这种方法。
☝️ 提交示例

下面实操,根目录分别创建test1\test2\test3依次提交三次
https://i-blog.csdnimg.cn/direct/7d4ba1a11d634a35a5d6bdb03e9b4fc5.png
☝️ 查看版本号

https://i-blog.csdnimg.cn/direct/8c11f2b0cfa7406b936d5c62398274c3.png
☝️ 撤销版本

利用git revert -n 版本号撤销
https://i-blog.csdnimg.cn/direct/9ffb03b168b048ff82b8bec5c9a9c3a4.png
大概利用idea操纵
https://i-blog.csdnimg.cn/direct/7cd054e8897247d7bf3876c86f7f06b2.png
https://i-blog.csdnimg.cn/direct/2811e8f9150e4d558546056f212a135f.png
如果是命令行必要重新commit
git commit -m 版本名
   撤销过后进行新版本提交 , 已查到最新提交.
可能会出现冲突 , 必要修改冲突的文件 , 而且要git add 文件名 , 加入当地仓库暂存区
☝️ 更新远程仓库

https://i-blog.csdnimg.cn/direct/eecbfd5665494e0fbd000634fe6d398d.png
☝️ 查看仓库

https://i-blog.csdnimg.cn/direct/a2faa8892fcf49c68705ae56db153d69.png
https://i-blog.csdnimg.cn/direct/b843667dd9f146ea87564e2746b5f938.png
https://i-blog.csdnimg.cn/direct/6f9187f809304e568b0c53a73bfcd62d.png
   更新成功 , "test2"已被撤销 , 其他被保留
末了
固然reset和revert都可以作为Git中的“后悔药”,但它们之间照旧有显着区别的。
功能上:reset是一个栈式操纵,会一次性失去从HEAD到目标提交这个区间内的所有提交;而revert是针对某一单独版本的撤销,提供了更准确的控制。
历史修改:reset直接修改了Git历史,被重置的提交相当于直接消散了,无法在过后追溯,非常伤害。而revert创建了新的提交,不会导致历史信息的丢失,就算改错了也能追根溯源,安全性更高!
   创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️
https://i-blog.csdnimg.cn/blog_migrate/3f21cd60a69933e31473a31cf59a9517.gif#pic_center

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【git reset & git revert】git后悔药之回滚及撤销操纵(图文详解)