如何清除git中的本地工作目录?

Han*_*son 675 git

如何在git中清除我的工作目录?

dbr*_*dbr 1049

要将特定文件重置为上次提交状态(以丢弃特定文件中未提交的更改):

git checkout thefiletoreset.txt
Run Code Online (Sandbox Code Playgroud)

这在git status输出中提到:

(use "git checkout -- <file>..." to discard changes in working directory)
Run Code Online (Sandbox Code Playgroud)

要将整个存储库重置为上次提交的状态:

git reset --hard
Run Code Online (Sandbox Code Playgroud)

要删除未跟踪档案,我通常只是删除工作副本中的所有文件(但不是.git/文件夹!),然后执行git reset --hard它只有提交的文件离开它.

更好的方法是使用git clean:( 警告:使用-x下面的标志将导致git删除被忽略的文件.)

git clean -d -x -f
Run Code Online (Sandbox Code Playgroud)

将删除未跟踪的文件,包括-dgit(-x)忽略的目录()和文件.将-f参数替换-n为执行干运行或-i交互模式,它将告诉您将删除的内容.

相关链接:

  • 请注意,默认情况下,'git clean -d'不足.您还需要添加-f(强制)标志.此外,如果要另外删除.gitignore忽略的文件,则需要添加-x选项.这就是它们的样子:git clean -xdf (21认同)
  • 但是请务必注意,该命令也会吹掉本地的sqlite数据库 - 不是撤消最近的更改,而是实际删除它.Sp"-x"选项可能不是一个好主意,具体取决于您尝试做什么. (10认同)
  • 请注意:删除除.git /`文件夹以外的所有文件然后通过运行`git reset --hard`恢复的建议可能需要很长时间,如果你的回购已经存在了任何时间.请不要这样做.使用`git clean`. (6认同)
  • **警告** 不要忘记 `-n` 进行试运行! (3认同)
  • 另请注意,`git clean -d -x -f` 会清除指向外部目录的符号链接。 (2认同)

Mar*_*rko 138

git clean -df
Run Code Online (Sandbox Code Playgroud)

编辑: 它没有很好的广告,但git clean非常方便.Git Ready有一个很好的介绍git clean.

更新:git clean根据以下评论中的建议删除了标记

  • 我建议不要使用`-x`参数,因为它会删除所有gitignored内容.假设你有一个名为'`gitignored`'的文件夹添加到`.gitignore`,你存储的文件必须是安全的,你也可以使用`-x`参数删除它们 (25认同)
  • @Marko当然,每个人都可以自由使用`-x`.但有些人可能会阅读这个github的答案,复制粘贴命令,并且没有意识到它会丢失他们想要保留的所有gitignored文件.然后回到这里,只注意@Highmastdon的评论,关于使用`-x`的后果. (8认同)
  • 让我们强调一下: - (5认同)
  • @Grastveit`git clean -xdf`将删除`.gitignore`,当且仅当它没有被添加时,才能按预期工作. (3认同)
  • 哎呀.`git clean -xdf`也删除了`.gitignore`,在下一次提交之前我没有注意到.我不会再忽视`.gitignore`了.:) (2认同)

dbn*_*dbn 43

到目前为止,所有答案都保留了本地提交.如果您真的很认真,可以通过以下方式丢弃所有本地提交和所有本地编辑:

git reset --hard origin/branchname
Run Code Online (Sandbox Code Playgroud)

例如:

git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)

这使您的本地存储库原始状态(未跟踪文件除外)完全匹配.

如果您在阅读完命令之后意外地执行了此操作,而不是它的操作:),请使用git reflog查找旧提交.

  • 超.我验证了你的观察.你是正确的伙伴.在您明确指定分支名称之前,`git reset --hard`不会清除本地提交.+1. (2认同)

nob*_*bar 11

您可以创建一个包含空工作副本的提交.

这是一种通常安全,非破坏性的方法,因为它不涉及使用任何强力复位机制.首先,您隐藏所有托管内容git checkout empty,然后您可以自由地手动查看和删除任何未管理的内容.

## 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
Run Code Online (Sandbox Code Playgroud)

您的工作副本现在应该清除任何托管内容.剩下的就是非托管文件和.git文件夹本身.

要重新填充您的工作副本......

git checkout master ## or whatever branch you will be using
Run Code Online (Sandbox Code Playgroud)

如果你是一个具有前瞻性思维的人,你可以通过将所有内容都放在最初的空提交中来启动你的知识库.

git init
git commit --allow-empty --allow-empty-message -m ""
git tag empty
...
Run Code Online (Sandbox Code Playgroud)

标记的空工作树有各种用途.我最喜欢的是在一组git worktree子文件夹下减少根.

  • 创建空结帐的更快捷的方法:`true | git mktree | xargs git commit-tree | xargs git tag empty` (5认同)
  • 注意:使用空提交作为项目的基础似乎有一些价值.这使得在初始提交需要修复的情况下更容易执行全项目rebase操作 - 并且可以在[将现有git存储库推送到svn时]简化操作(http://stackoverflow.com/questions/661018/pushing -an存在-混帐存储库到SVN). (2认同)
  • 像大多数其他工作流程一样,如果您使用Git子模块,这会变得混乱. (2认同)

Tob*_*ias 9

要切换到另一个分支,丢弃所有未提交的更改(例如,由Git奇怪处理行结尾):

git checkout -f <branchname>
Run Code Online (Sandbox Code Playgroud)

我有一个包含数百个已更改文件(但是空的git diff --ignore-space-at-eol)的工作副本,我无法用我在这里阅读的任何命令消除这些文件,并且git checkout <branchname>除非给出-f(或--force)选项,否则将无法工作.