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,指针向后移动。

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,就这么回事

到此这篇关于git中reset和revert区别小结的文章就介绍到这了,更多相关git reset revert内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部