git reset 、git revert和git rebase 区别

1,344 阅读3分钟

 git revert 用法

git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销
作为一次最新的提交
* git revert HEAD                  撤销前一次 commit
* git revert HEAD^               撤销前前一次 commit
* git revert commit (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,
版本会递增,不影响之前提交的内容

git reset 用法

git reset 主要用于重置代码,使工作区回到过去的某个状态,主要有3种用法:

使用参数 --hard,如 git reset --hard < commit ID >
直接把 HEAD 指针移动到 commit ID 上,无论修改是否被 add 、 commit ,都直接重置(此时暂存区被清空,工作区的修改被清空),所做的修改将全部丢失,这是非常危险的。但是如果你修改之后进行了 commit 操作,那非常好办,可以用 reflog 查询相应的 hash 值,进行恢复;如果你修改之后,进行了 add 操作,也可以恢复,但是比较麻烦,用 git fsck --lost-found ,参考此博客;如果你修改之后既没有进行 commit 操作也没有进行 add 操作,暂时不知道恢复方法。
使用参数 --soft,如 git reset --soft < commit ID >
使用该参数是安全的,它是把 HEAD 指针移动到 commit ID 上,暂存区和工作区不变。
使用参数–mixed或者不使用参数(默认为–mixed),如 git reset < commit >
使用该参数是安全的,它是把 HEAD 指针移动到 commit ID 上,暂存区被清空,工作区的修改保留。

 

git rebase 用法

git rebase使用技巧 

www.cnblogs.com/ygunoil/p/1…

区别

  1. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。 \
  2. 在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。 \
  3. git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

可以这样简单记忆:

git revert 放弃某次提交
git revert 之前的提交仍会保留在git log中,而此次撤销会做为一次新的提交。

git reset 是回滚到某次提交
git reset --soft
此次提交之后的修改会被退回到暂存区
git reset --hard
此次提交之后的修改不做任何保留,git status干净的工作区。

git rebase 当两个分支不在一条直线上,需要执行merge操作时,使用该命令操作。 该命令执行时极有可能显示merge失败\