1. 案例
线上master分支不可信,需要回到某个分支;
但是很多人习惯把一个需求,分多次commit,于是会出现下面这种情况
基于这种情况,git revert 就不如 git reset好用,可以借助Idea,直接通过 git reset --hard 指向需要回退到的commit,然后随便找个地方,敲上一个空格,产生一次新的commit id,即可达到效果;
2. git的 reset 和 revert 有啥区别?
2.1 问题背景
在某一次的上线中,发现有的同学,上线之后发现master 分支存在bug,线上回滚之后,在处理git仓库回滚分支时,因分不清reset(重置)
、revert(恢复)
两者的区别,使用git reset回退之后,再与master merge时,发现master无变化,因为作为此次引入案例,分享一波;
先简单说一下,在提交到远程库之前我们使用git reset 命令完全可以满足我们 撤销操作的需求,如果操作已经提交到远程库,那只好使用 git revert 来提交一个新的撤销操作 撤销 需要撤销的那次commit
。
2.2 git的工作流
-
工作区
:即自己当前分支所修改的代码,git add xx 之前的!不包括 git add xx 和 git commit xxx 之后的。 -
暂存区
:已经 git add xxx 进去,且未 git commit xxx 的。 -
本地分支
:已经git commit -m xxx 提交到本地分支的。
在将文件提交至远程端时,文件的提交需要经过git add、git commit及git push三个过程才能提交至git远程仓库。
我们平时修改文件在工作目录中,提交时先使用git add提交至暂存区,再通过git commit提交至本地仓库,最后才能使用git push提交至远程仓库。
2.2.1 在工作区的代码
git checkout -- . # 丢弃全部
注意:git checkout – . 丢弃全部,也包括:新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去。这几个前提都说的是,回到暂存区之前的样子。对之前保存在暂存区里的代码不会有任何影响。对commit提交到本地分支的代码就更没影响了。当然,如果你之前压根都没有暂存或commit,那就是回到你上次pull下来的样子了。
2.2.2 代码git add到缓存区,并未commit提交
git reset HEAD . 或者
git reset HEAD a.txt
这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化
2.2.3 git commit到本地分支、但没有git push到远程
git log # 得到你需要回退一次提交的commit id
git reset --hard <commit_id> # 回到其中你想要的某个版
或者
git reset --hard HEAD^ # 回到最新的一次提交
或者
git reset HEAD^ # 此时代码保留,回到 git add 之前
2.2.4 git push把修改提交到远程仓库
2.2.4.1 通过git reset是直接删除指定的commit
git log # 得到你需要回退一次提交的commit id
git reset --hard <commit_id>
git push origin HEAD --force # 强制提交一次,之前错误的提交就从远程仓库删除
2.2.4.2 通过git revert是用一次新的commit来回滚之前的commit
git log # 得到你需要回退一次提交的commit id
git revert <commit_id> # 撤销指定的版本,撤销也会作为一次提交进行保存
git commit -m "......."
git push
2.3 reset
git reset中有三个命令(–hard、–soft与–mixed);主要用于工作区、暂存区、本地仓库三个区域的文件提交撤回
git reset --hard xxx
-
hard (修改版本库,修改暂存区,修改工作区)
- –hard HEAD~1 (或是版本号)意为将版本库回退1个版本,但是不仅仅是将本地版本库的头指针全部重置到指定版本,也会重置暂存区,并且会将工作区代码也回退到这个版本;
git reset --soft xxx
- soft (修改版本库,保留暂存区,保留工作区)
- –soft HEAD~1 意为将版本库软回退1个版本,所谓软回退表示将本地版本库的头指针全部重置到指定版本,且将这次提交之后的所有变更都移动到暂存区。
2.4 revert
git revert xxx
– git revert 也是撤销命令,区别在于reset是指向原地或者向前移动指针,git revert是创建一个commit来覆盖当前的commit,指针向后移动。文章来源:https://www.toymoban.com/news/detail-842067.html
2.5 git revert 和 git reset的区别
- git revert是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留;
- git reset是回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除;
- git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
- 在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。
- git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
通俗易懂的说呢,就是git revert 是回滚当前此次的commit,回到上一个状态,就好比咱们习惯性用的Ctrl+z; 而git reset 是回到历史某个版本,它的commit是旧的,是历史的,而git revert 会产生新的commit,就这么回事文章来源地址https://www.toymoban.com/news/detail-842067.html
到了这里,关于git的 reset 和 revert 区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!