如何清除Git中的工作目录?
- 用户交互方式:git clean-i-fd
- 我不明白为什么这个问题被标记为重复。另一个问题是只从working directory文件中删除untracked文件,而不是从modified文件中删除untracked文件。
要将特定文件重置为上次提交状态(要放弃特定文件中的未提交更改),请执行以下操作:
1
| git checkout thefiletoreset.txt |
这在git status输出中提到:
1
| (use"git checkout -- <file>..." to discard changes in working directory) |
要将整个存储库重置为上次提交的状态,请执行以下操作:
要删除未跟踪的文件,我通常只删除工作副本中的所有文件(但不删除.git/文件夹!),然后执行git reset --hard,只留下提交的文件。
更好的方法是使用git clean(警告:使用下面的-x标志将导致git删除被忽略的文件。)
将删除未跟踪的文件,包括目录(-d和git忽略的文件(-x)。将-f参数替换为-n以执行试运行,或将-i替换为交互模式,它将告诉您将删除什么。
相关链接:
- Git重置手册页
- Git清洁手册页
- Git Ready"清理未跟踪的文件"(如Marko发布的那样)
- stackoverflow问题"如何从Git工作副本中删除未跟踪的文件?"
- 请注意,默认情况下,"git clean-d"不足。您还需要添加-f(force)标志。此外,如果要另外删除.gitignore忽略的文件,则需要添加-x选项。这就是它看起来的样子:Git Clean-xdf
- 不过,请务必注意,该命令还会吹走本地的sqlite数据库——不是撤消最近的更改,而是实际删除它。sp"-x"选项可能不是一个好主意,这取决于您试图做什么。
- 我百分之百肯定我运行了git clean-d-f(不带-x),它还删除了被忽略的文件。
- 请注意:建议删除除.git/文件夹以外的所有文件,然后通过运行git reset --hard恢复,如果您的repo一直存在,可能需要很长时间。请不要这样做。使用git clean。
- 在尝试使用这个命令时,我发现了一件事,那就是知道这是否是问题所在。结果发现我的一个同事在页面顶部的"工作副本"下拉列表设置为"所有文件",而该文件应为"挂起"。这使得一个文件加载被更改的外观,实际上,它只是显示项目中的所有文件,就像它应该做的那样。因此,解决这个问题的方法就是从"工作副本"屏幕的下拉列表中选择"挂起的文件"。如果这对任何人都有帮助,请告诉我。
- 还要注意,git clean -d -x -f会将指向外部目录的符号链接吹走。
- git clean -fdx选项非常有用。它帮助我删除了一些隐藏的未跟踪文件,我不知道这些文件会影响我的编译。
- 警告:干运行时不要忘记使用-n!
- 快速添加:您可以使用类似这样的通配符重置整个子目录。注意模式周围的引号。git checkout master 'subdir/*'
编辑:它的广告不怎么好,但git clean真的很方便。Git Ready对git clean有一个很好的介绍。
Update: removed the x flag based on the suggestion in the comment below
- 我建议不要使用-x参数,因为它将删除所有gitignored内容。假设您在.gitignore中添加了一个名为'gitignored的文件夹,并且您将必须安全的文件存储在该文件夹中,您还将使用-x参数删除它们。
- 哎呀。git clean -xdf也删除了.gitignore,我在下一次提交之前没有注意到。我再也不会忽视.gitignore。:)
- @Grastveit git clean -xdf将删除.gitignore,如果且仅当它没有被添加到,从而按预期工作。
- 让我们强调一下:???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
- @如果我一直使用git clean -xdf,而不是使干净、蚂蚁干净、mvn干净或其他任何东西。没有一般规则,每个人都可以自由使用-x或不使用。
- @Marko当然,每个人都可以自由使用-x。但是有些人可能会阅读这个github答案,复制粘贴命令,并且在没有意识到它的情况下,释放他们想要保留的所有gitignored文件。然后回到这里,只注意@highmastdon的评论,关于使用-x的结果。
到目前为止,所有答案都保留了当地的承诺。如果您是认真的,可以通过执行以下操作放弃所有本地提交和所有本地编辑:
1
| git reset --hard origin/branchname |
例如:
1
| git reset --hard origin/master |
这使您的本地存储库完全匹配源站的状态(而不是未跟踪的文件)。
如果您只是在读取命令后意外地执行了此操作,而不是执行的操作:),请使用git reflog查找旧的提交。
- 是否确实需要分支名称?对我来说,git reset --hard只不过是为当前工作的分支机构工作,没有分支机构的名称。
- 如果没有分支,则不会清除本地提交。
- 哦。好啊。我的观察只是关于本地修改和新添加的未跟踪文件。因此,如果我正确地获得了您的信息,那么如果在本地分支中有任何文件被暂存或已经提交(还没有推送),那么如果我不显式地使用分支名称,那么将不会被清除。对的?
- 超级的。我证实了你的观察结果。你说得对,伙计。在明确指定分支名称之前,git reset --hard不会清除本地提交。+ 1。
您可以创建一个包含空工作副本的提交。
这是一种通常安全的、非破坏性的方法,因为它不涉及使用任何蛮力重置机制。首先使用git checkout empty隐藏所有托管内容,然后可以自由地手动查看和删除任何未托管内容。
1 2 3 4 5
| ## create a stand-alone, tagged, empty commit
true | git mktree | xargs git commit-tree | xargs git tag empty
## clear the working copy
git checkout empty |
您的工作副本现在应该没有任何托管内容。剩下的都是未管理的文件和.git文件夹本身。
要重新填充工作副本…
1
| git checkout master ## or whatever branch you will be using |
如果你是一个有远见的人,你可能会以一个初始的空提交为基础来启动你的存储库。
1 2 3 4
| git init
git commit --allow-empty --allow-empty-message -m""
git tag empty
... |
标记的空工作树有多种用途。目前我最喜欢的是在一组git worktree子文件夹下对根进行去填充。
- 这也是节省一些磁盘空间的好方法。
- 创建空结帐的更快方法:true | git mktree | xargs git commit-tree | xargs git tag empty
- 注意:使用空提交作为项目的基础似乎有一些价值。这使得在初始提交需要修复的情况下更容易执行完整的项目重新平衡操作,并且在将现有Git存储库推送到SVN时可以简化这些操作。
- 与大多数其他工作流一样,如果您使用Git子模块,这会变得很混乱。
- "git init&;git commit--allow empty"empty commit&;git tag empty"也可以完成第一个块的工作。
- 如果您在签出empty之前使用make clean或等效工具,可能会有更好的运气。:)
要切换到另一个分支,请放弃所有未提交的更改(例如,由于Git对行尾的奇怪处理而导致的更改):
1
| git checkout -f <branchname> |
我有一份工作副本,里面有数百个更改过的文件(但是清空了git diff --ignore-space-at-eol),我不能用我在这里读到的任何命令删除这些文件,而且git checkout 也不能工作,除非有-f或--force选项。
要按Git状态建议重置特定文件,请执行以下操作:
重置文件夹
1
| git checkout <foldername>/* |