第十三周_T-git revert

109 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 6 天,点击查看活动详情

撤销命令:会基于当前指定的 commit 生成一个新的 commit,不会改动项目历史提交。

一般是使用了单个的提交引入,我们可以直接 revert 即可,而不用手动修改再提交

当前分支

场景

我这里分别对两个文件进行了3次提交,所以总共是四次提交。

冲突

当我想要撤销‘初始化test’这个 commit 的时候

git revert -n 4101f89

会提示冲突,因为我们后面的提交对这个文件做了改动,此时需要手动解决冲突,然后再提交。

git revert --abort :即可还原(相当于没做过git revert 操作)

正常

当我们对 ‘第二次写入 test’撤销时:

git revert 7196cf2

这里会弹窗一个 vi 界面,可以修改提交备注,但是一般就不用改了,直接加上 -n 参数

此时再次查看 log 提交记录,发现生成了一个新的 commit ,而且备注也很明了,直接就时 Revert + 你原来 commit 的备注。

然后提交即可。

还原被 revert 的 commit

这里对刚刚的 revert 之后,又对另外的文件做了提交。此时发现需要刚刚撤销的内容。即:把“第二次写入 test”还原。

只需要对 revert 这个 commit 撤销即可。然后再次查看文件内容,正常了。

merge之后的分支

冲突

模拟分支合并:revert 、dev 分支。

此时想要撤销此提交:

如果使用正常的 revert 命令,则会报错:因为 git 也不知道改撤销哪个分支。

正常

需要加上 -m 参数;下面是查看一个 merge 的父类

git revert -m 1 commitId(下图中生成的 merge commit)

这样就可以正常撤销,然后查看提交内容确实没了。

后续想要继续使用 revert 的merge

如果此时,我不做任何操作,我直接在 merge 做其他操作,然后 merge 到 dev。那么在 dev 上被撤销的内容,不会被 merge 过来。

此时,我们需要对刚刚 revert 的 merge commit ,再做一次 revert 操作。然后在合并即可。

总结

多个 commit 需要撤销:

git revert OLDER_COMMIT^..NEWER_COMMIT

revert vs reset

关于 reset 的操作,可以参看下面的文章:juejin.cn/post/717014…

reset:把其中一个或多个 commit 的内容撤销,然后生成一个新的 commit ;原来的 commit 不会变

revert:回到指定的 commit ,这个 commit 以后的提交都会消失

如果是想回退集成分支上的东西,那么一定使用 revert 重新生成提交,而不是 reset 然后强行 push -f 。会被人骂的。