Git reset 和 Git revert 实践

最近工作中准备发布生产,于是将开发分支合并到 master 并且提交到远程,悠哉悠哉地坐等上线。可恶的产品 dog 又说先别上线,让测试环境给一线先体验一下,FUCK!怎么办?代码已经合并推送到远程,如果不撤回会影响其他团队的发布,由于以前只是对 git reset 和 git revert 了解一下,并没有深入去使用过,所以在项目代码中不敢轻易妄动,只能拜托其他同事帮忙了。吃了这次亏,决定深入学习一下这两个命令。
1、git reset 重置 commit
我们先创建两个 commit

git reset和git revert 实践
现在我们使用 git reset 不加参数对commit进行重置

git reset和git revert 实践
git reset 不加参数的情况默认使用的参数是 –mixed ,该参数模式是将提交回退到指定版本,将该版本之后所提交的改动回退到工作区。如果我们提交出错还需要编辑再提交就可以使用该模式。同时我们发现 reset 到目标版本后,之前的最新版本的 commit 已经被丢掉了。
当然我们使用 git reflog 是可以找回被 git reset 丢掉的 commit 的,我们利用 git reflog 和 git reset 恢复刚才的 reset

测试 git reset –soft
git reset和git revert 实践
我们可以看到当带 –soft 参数时,回退目标版本后的修改内容会回退到暂存区

测试 git reset –hard

git reset和git revert 实践

从图中我们可以看出,git reset 带 –hard 参数后,会丢掉目标版本之后的修改,此场景适用于回退,且不需要后面版本内容。
使用 reset 回退版本后,由于本地版本先于远程版本,推送时需要使用 -f 强推参数,git push -f 。
2、git revert
git revert 是将 commit 中的某一版本丢掉,然后将该版本前后的版本内容进行合并生成新的 commit ,对比 reset ,revert 不会丢失 commit 信息,而 reset 会丢失 commit 信息。
这个可以应用到场景:A同学提交代码后并推送到远程,版本为a1;B同学这时拉取代码进行开发,A同学a1版本有问题,需要回退,于是A同学将a1版本回退并推送到远程。B同学开发后生成了B版本,提交到远程,这里B同学还是把A同学的a1版本提交上去了。现在我们就要把 a1 版本丢掉,并且保留B同学的 b1 版本。

git reset和git revert 实践

git reset和git revert 实践
总结:使用 git reset 丢失已经提交的 commit ,可以进行再编辑处理进行提交,使用git revert 丢掉 commit 的修改并生成新的 commit 进行提交,但是有丢掉版本的的前后版本在合并成新的 commit 时,容易生成冲突。

本作品采用《CC 协议》,转载必须注明作者和本文链接
雪花飘
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!