天天看点

GIT 回滚 revert 和 reset 区别

背景

git 是一个庞大的工具,我们要开始扫盲一些常用的命令。回滚代码在项目中必然会遇到,下面我们介绍在 git 中如何回滚代码。

revert

假设有如下 commit 记录

A <- B <- C <- D      

说明:尖头方向表示 parent 节点,及​

​A <- B​

​ 表示先提交了 A,再提交了 B

情况一:现在不想要 D 了

git revert hash(D)      

执行命令后会让填写 message, 相当于一次 commit, 此时多了一次提交 E,如下

A <- B <- C <- D <- E(revert)      

D 这次的提交不会包含在 E 里面,于是回滚成功。

回到之前,

A <- B <- C <- D      

情况二:然后这次想回滚到 C(注意是回滚到 C,及 C、D 都不要了)

git revert hash(B)..HEAD      

注意这个 hash 的取值,是 B, 不是 C 的 commit hash

执行命令后会让你填写 2 次 message, 最后提交记录也有两次

A <- B <- C <- D <- E(revert) <- F(revert)      

回到之前

A <- B <- C <- D      

情况三:然后这次想回滚 C(注意是回滚 C,及 C 不要了,但是 D 还需要),其实跟情况一是同样的

git revert hash(C)      

执行命令后填写 1 次 message

A <- B <- C <- D <- E(revert)      

小结:

​revert hash​

​ 这个 hash 为对应想删除的 commit

​revert hash..HEAD​

​ 这个 hash 对应的 commit 不会被删除,会删除到它的后一次 commit

​revert​

​ 会产生新的提交,并不会真正删除 history。

reset

同样,假设有如下 commit 记录

A <- B <- C <- D      

想删除到 C(及 C、D 都不要了)

git reset hash(B) --hard      

注意,这里 B 的 hash,而非 C 的。

执行命令后本地的 commit history 就被干掉了

A <- B      

当执行 ​

​git push​

​​ 的时候,会被提示不能提交。但凡修改历史跟 origin 有冲突的,都必须强项覆盖提交,这时大胆执行​

​git push -f​

​同步到 origin.

这里 reset –hard 表示暂存区,工作区都不需要保留回滚回来的代码。如果不加,会出现这种情况,比如 ​

​git reset hash(B) --hard​

​, 那么删除掉的 C, D 的文件会进入工作区。

小节:

总结