在上一篇中,介绍了 Git 、Git 的安装以及基本使用
用 git add
将修改的文件添加到 暂存区,用 git commit
将暂存区的内容提交到 Git 管理,使用 git push
将本地内容同步到远端仓库中。使用 git status
来查看当前文件状态,git log
来看提交记录,git diff
用来查看修改内容。
如果已经 add 了,怎么取消呢?
已经 commit 了,该如何撤回呢?
本篇来解决这个问题 ↓↓
丢弃工作区修改(取消修改内容)
首先先说明下修改的概念,修改是什么?
比如添加了一行,修改了一行,或者删除一样都是修改,加个换行符一个空格也都是修改,创建一个新文件,或删除一个文件都是修改。
假设小王在 test 文档中不小心撒了欢儿,打出了lalala,如果发现了可以手动恢复到上一个状态。
当然通过 Git 也完成这一操作。
如果用 status 看一下,Git 会提示有两种操作
- 使用
git add
添加 - 使用
git checkout -- <file>
丢弃工作区修改
git checkout -- <file>
就是我们要使用的
再来看下 test.txt, 已经恢复了改动之前的内容
git checkout
用来丢弃工作区修改,回退到上一次commit
-
git checkout -- <file>
舍弃某个文件的改动,注意一定要有“--” checkout 还可以对分支进行操作,后续再了解 -
git checkout .
注意有“.” 舍弃工作区当前全部改动
移除暂存区(针对add)
小王改了 test 文件,打算提交了,就用 add 放在了暂存区,然后发现 test 还有要修改的地方,怎么办?
这时候有两种方法
- 如果想继续修改再提交,那么继续修改再 add 就可以
- 如果是多个文件,有其中一两个文件,或者全部文件都不想提交了,就需要把暂存区的文件撤回到工作区
目的就是使得 暂存区的文件都是可以提交的内容,如果不需要就要移出暂存区
上面我们修改了 test 文件,还没有添加到暂存区,如果添加到暂存区的文件怎么撤回呢?
修改下文件,并 add
Git 会提示使用
git reset HEAD <file>
将 stage 状态改为 unstage,也就是移出暂存区到工作区
可以看到此时并不会丢弃修改的内容,而是将暂存区的文件撤回到工作区,这就是 git reset HEAD <file>
的用法,reset 也可以像 add 和 checkout 一样有全部操作,git reset .
即可
举个例子,现在有多个文件修改了,有部分文件需要提交,但是add . 全都提交了,就可以使用 reset 将待提交的文件撤回到工作区。
撤销上一次提交(针对commit)
先看一组操作,修改 test 内容,并进行一次提交 ,说明一下 commit123
现在修改的文件被提交了并且 commit 了,现在发现提交的有问题,不想提交了,怎么办?
git reset --soft HEAD^
不删除工作区的改动,撤销commit,将内容存放在暂存区(add 之后),HEAD^ 或 HEAD~1 表示上一次 commit(HEAD~2就是上上次commit), 也可以接commitid,如 git reset --soft 8f1fe9
,撤销commit 到 「github commit」 那一次提交,之后修改的内容都在暂存区
reset 命令的其他参数及比较
git reset -- soft
撤销commit,保留修改内容到暂存区(index)
git reset --mixed
撤销commit,保留修改内容到工作区(working dir)
git reset --hard
撤销commit,直接丢弃修改,回退到指定的 commit,也可以理解成,强制回退到某一版本
删除文件
在 Git 中,删除也是一个修改操作,如果需要删除操作方式和前面所说的修改是一致的
我们先新建一个文件 test2.txt,并提交
现在要删除 test2 文件
可以直接删除, 也可以用命令 git rm <file>
进行删除
确认删除也就是 delete之后提交,那么这个文件就被删除,且改动记录在版本库中了
如果一个文件已经被提交到版本库,那么你永远不用担心误删
上面是一个已经添加到版本库的文件删除,如果是一个未监视的文件(untracked file),一般是创建新文件或文件夹,你会发现 checkout
和rm
都不起作用
我们再新建一个test2.txt, 同时建立一个文件夹 new
这时候如果要删除,可以手动删除,或者使用git clean
,上面的图中可以看出,status 查看,文件是可以显示出来的,但是新建的目录并没有显示
git clean 有些常见参数
git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>
- -d,移除未监视目录和文件
- -f(--force),表示强制删除
- -n (--dry-run),只显示将要做什么
详情可参考 https://git-scm.com/docs/git-clean
参数比较多,但是常用主要有下面几个
-
git clean -f
删除 untracked files (仅删除未监视文件,不包含目录)
上面只删除了 test2,如果要删除某一个文件git clean -f <file>
git clean -fd
会删除 untracked 的文件和目录
又新建了test2 文件,使用 -fd 会将未监视的目录也删掉
同样,删除某一个文件夹
git clean -fd <dir>
-
git clean -xfd
连 gitignore 的 untracked 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
直接删除可能会有风险,可能删除我们不想删掉的内容,所以在用上述 git clean 前,建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
git clean -nf
(或 git clean -f -n
)
git clean -nfd
(或 git clean -fd -n
)
git clean -nxfd
(或 git clean -xfd -n
)
再新建 test2 和 new文件夹
使用 添加 -n 先查看,这样可以避免误删操作
回顾总结
- 撤销工作区修改,使用
git checkout --<file>
或git checkout .
- 撤销暂存区提交,使用
git reset HEAD^
或git reset .
- 撤销 commit,使用
git reset [--soft | --mixed | --hard] HEAD^
或git reset [--soft | --mixed | --hard] commitId
, 默认为 mixed
删除已提交的文件 git rm <file>
删除 untracked files 使用 git clean
-
git clean -f
删除 untracked files -
git clean -fd
(或git clean -f -d
)删除 untracked files 和目录 -
git clean -xfd
连 gitignore 的 untracked 文件/目录也一起删掉(不常用)
加 -n 可以先查看将会删除的内容
如git clean -nf
(或git clean -f -n
)
结合上一篇内容在 Git 管理中涉及到的命令以及区间关系
能够熟练掌握 Git 工作区及其相关指令的关系,那么恭喜你,已经成功入门了!
系列文章传送门
Git 入门系列(一)- Git 概念/安装/基本操作/远程推送更新
Git 入门系列(二)- 修改管理 / 撤销操作 / 命令及区间关系
Git 入门系列(三)- 分支(上)创建与切换 / 合并 / 查看 / 删除
Git 入门系列(四)- 分支(下)合并解决冲突 / 远程分支
Git 入门系列(五)- stash 贮藏
Git 入门系列(六)- 标签 tag
Git 入门系列(七)- 可视化 Git 管理工具
Git 入门系列(八) - FAQ
欢迎关注个人公众号,【程序媛春哥的手记】