git revert & git reset

git revert 和 git reset

这两个都可以实现分支回退

git reset

如果想要不留痕迹的撤回 git reset 是更好的选择

git reset --hard commit id

这个 commit id 表是要会退到的那次提交

表示从这个提交之后的所有提交都会被取消掉

直接回到这个提交的状态。

然后 push 到远端,但是此时会被报错,因为本地的分支此时是落后于远端的分支的

所以我们需要 push -f

现在讨论一下这个几个 reset 参数的区别

-- soft 表示只重置版本库,回到 add 之后的状态,也就是说暂存区的代码还是存在的

-- hard 表示重置版本库,工作区,暂存区,此次提交的所有代码都将会消失

-- mixed 表示会重置版本库和暂存区,回到 add 之前的状态 本地的修改还是存在的

git revert

git revert commit id

表示需要撤销的那次 commit id 而不是回退到的 commit

此时这个 commit id 之前和之后的提交内容还是会被保留 ,而不像 reset,那次 commit id 之后的提交都会被删除
git revert 是提交一个新的版本,将需要 revert 的版本的内容再反向修改回去,
版本会递增,不影响之前提交的内容

git push upstream branchname

推送到远程的分支

但是需要注意的情况是:

场景:

现在的需求是我之前已经把 a 分支 revert 了,但是我现在又需要 a 分支的代码了,我之前都写过一遍总不能再重新写一遍了。我首先想到的方法,把 a 分支再 merge 到 develop 不就好了。

结果:

Already up-to-date

原因:

因为我们之前提交合并的 a 分支的代码还在,因此我们并不能在重新合并 a 分支

解决方式:

使用 revert 之前 revert 的 commit 号。于是又新增了一个 commit,把之前 revert 的代码又重新 revert 回来了

区别

git revert 是用一次新的 commit 来回滚之前的 commit,git reset 是直接删除指定的 commit。
这个很好理解,在刚才的操作中我们看日志已经可以看到这个现象。
git reset 操作之后,我们查看上面例子的 network 已经可以看到 network 中只有 commit 1,分支 a 和合并分支后的 commit 3 都消失了;
git revert 操作之后,network 中还是可以看到 a 分支和合并 a 分支的操作,只不过在其基础上又增加了一个 revert 的 commit 而已。

git reset 是把 HEAD 向后移动了一下,而 git revert 是 HEAD 继续前进,只是新的 commit 的内容和要 revert 的内容正好相反,能够抵消要被 revert 的内容。
这个也是可以清晰明了的看到,我就不做过多的解释了

在回滚这一操作上看,效果差不多。但是在日后继续 merge 以前的老版本时有区别。因为 git revert 是用一次逆向的 commit“中和”之前的提交,因此日后合并老的 branch 时,导致这部分改变不会再次出现,但是 git reset 是之间把某些 commit 在某个 branch 上删除,因而和老的 branch 再次 merge 时,这些被回滚的 commit 应该还会被引入。

使用场景

如果回退分支的代码以后还需要的话用 git revert 就再好不过了;
如果分支我就是提错了没用了还不想让别人发现我错的代码,那就 git reset 吧
例如:develop 分支已经合并了 a、b、c、d 四个分支,我忽然发现 b 分支没用啊,代码也没必要,这个时候就不能用 reset 了,因为使用 reset 之后 c 和 d 的分支也同样消失了。这时候只能用 git revert b 分支 commit 号,这样 c 和 d 的代码依然还在。

你可能感兴趣的:(git revert & git reset)