开启掘金成长之旅!这是我参与「掘金日新计划 · 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 。会被人骂的。