本节课会分享如何抛弃现已不要的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″。

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

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

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

运行后,他会呈现一个抵触比照,要求我修正完成后从头提交。(revert是添加一个吊销了更改的新提交)

这个提交,会呈现”10″和”12″的比照。

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

修正完比照后,咱们commit这次修正。

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

看下日志,咱们能够看出,revert是新做了一个吊销代码的提交。

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

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

rebase

前面课程说过,rebase是对已有commit的重演,rebase指令也能够删去某个commit的。他和reset一样,删去掉的commit就彻底消失了,无法复原。 详细用法,这里不在再次介绍,能够去看前面的课程。

开启生长之旅!这是我参与「日新计划 2 月更文应战」的第 13 天,点击查看活动概况