Git-删除本地的工作

  |  

摘要: git 如何删除本地的工作

【对数据分析、人工智能、金融科技、风控服务感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:潮汐朝夕
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


在本地 master 分支中做了许多工作,增加了一些文件,修改了一些文件。后来另一个同事在远程的 master 中推送了修改,我需要将远程的 master 拉下来,但直接 git pull 会报错,需要先将本地的 master 中的修改作废,具体如下:

  • 修改的文件恢复原样
  • 新增的文件删除掉

此时本地 master 中的许多工作有的已经跟踪(已经执行过 git add),有的尚未跟踪。完整地完成将本地工作作废这个需求需要两步:

(1) 返回到某个节点,不保留修改,已有的改动自动丢失

1
git reset --hard HASH

git reset 只影响已跟踪过的文件,如果返回到某个节点需要保留修改,还可以将 --hard 改成 --soft

(2) 将未跟踪过的文件删除

1
git clean -df

git clean 从工作目录中删除所有未跟踪的文件,有一些参数:

1
2
3
4
5
6
-n: 不实际删除,只是展示将要进行的操作,将要删除的文件
-f: 删除文件,不会删除 .gitignore 忽略的内容,不论是否跟踪
-d: 递归删除目录以及文件
-i: 显示将要删除的文件
-q: 仅显示错误,成功删除的文件不显示
-x: 将 .gitignore 忽略的内容也删除掉

综合 (1)(2) 两点,实现这个将本地工作作废的需求的完整流程如下:

1
2
3
4
git fetch
git reset --hard origin/master
git clean -df
git pull

git resetgit clean 经常配合使用,达到将工作目录完全回到指定的提交节点的状态。其中 git reset 影响已经跟踪的文件,git clean 影响尚未跟踪的文件。

此外 git clean 对于刚编译过的 c++ 项目比较有用,可以轻松删掉编译后的 .o, .out.exe 等文件,打包发布 release 之前用很高效。

git resetgit clean 危险的操作,需要将相关的参数含义全都搞清楚,否则万一删错了东西将不可恢复。例如:

  • 有一些工作之前 git stash 过,后面 git reset --hard 后 stash 中的东西也会消失,这需要考虑到
  • git clean -xdf 会将 .gitignore 忽略的文件和文件夹也会全部删掉,如果涉及到本地需要的项目文件,则需要重新配置了。

Share