注册
Git

[Git废弃提交]需求做一半,项目停了,我该怎么废弃commit

在实际开发中我们要拥抱变化。我们都知道需求它是很不稳定的,在实际开发过程中会经常改变。经常会遇到一个需求,已经开始进入开发阶段了,开发到一半的时候说这个功能不需要了。甚至会出现我们已经实现某一个功能,然后被告知,这个功能被砍掉了。


那么针对这种代码已经写了,现在要废弃的情况我们应该怎么操作呢?


当然,如果这个功能都在一个单独的分支上,且这个分支只有这个功能的代码,那么可以直接废弃这个分支。(这也是为什么会有多种Git工作流的原因,不同的软件需求场景,需要配合不同的工作流。)


代码还没有提交


如果代码还在本地,并没有提交到仓库上。可以用reset来重置代码。
git reset是将当前的分支重设(reset)到指定的commit或者HEAD(默认),并且根据参数确定是否更新索引和工作目录。

# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
git reset [file]
# 重置暂存区与工作区,与上一次commit保持一致
git reset --hard
# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
git reset [commit]
# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --hard [commit]
# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
git reset --keep [commit]

其实reset也可以指定某个commit,这样就会重置到对应的commit,该commit之后的commit都会丢失。如果你没法确定这些commit中是否有需要保留的commit,就不要这样操作。


如果代码已经提交


如果代码已经提交了,且提交的分支上还有其他的代码。那么操作起来就比较麻烦。我们需要用revert来删除。


revert


git revert命令用来「撤销某个已经提交的快照(和reset重置到某个指定版本不一样)」。它是在提交记录最后面加上一个撤销了更改的新提交,而不是从项目历史中移除这个提交,这避免了Git丢失项目历史。

# 生成一个撤销最近的一次提交的新提交
git revert HEAD
# 生成一个撤销最近一次提交的上n次提交的新提交
git revert HEAD~num
# 生成一个撤销指定提交版本的新提交
git revert <commit_id>
# 生成一个撤销指定提交版本的新提交,执行时不打开默认编辑器,直接使用 Git 自动生成的提交信息
git revert <commit_id> --no-edit

比如我现在的dev分支,最近3次提交是"10","11","12"。


0d70ab9816d04f9a9419d4092dea6bee~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp

我现在要11这个提交去掉,我就直接revert "11" 这个commit


b4322c691d964d0e9a361a8a0d4945a1~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp

运行后,他会出现一个冲突对比,要求我修改完成后重新提交。(revert是添加一个撤销了更改的新提交)


这个提交,会出现"10"和"12"的对比。


36aeba047fff4924b2bd31f2aa4d49a5~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp

修改完对比后,我们commit这次修改。


e8513e32fde84d558bd584046dcf3a61~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp

看下日志,我们可以看出,revert是新做了一个撤销代码的提交。


d6188f3195014292bc7cd6c1c93685f6~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp

撤销(revert)被设计为撤销公共提交的安全方式,重设(reset)被设计为重设本地更改。
因为两个命令的目的不同,它们的实现也不一样:重设完全地移除了一堆更改,而撤销保留了原来的更改,用一个新的提交来实现撤销。「千万不要用 git reset 回退已经被推送到公共仓库上的提交,它只适用于回退本地修改(从未提交到公共仓库中)。如果你需要修复一个公共提交,最好使用 git revert」。


rebase


前面课程说过,rebase是对已有commit的重演,rebase命令也可以删除某个commit的。他和reset一样,删除掉的commit就彻底消失了,无法还原。
具体用法,这里不在再次介绍,可以去看前面的课程。


作者:写代码的浩
链接:https://juejin.cn/post/7206116224840695866
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 个评论

要回复文章请先登录注册