1

我试图从我删除的分支中删除一个未跟踪的文件,但我不小心删除了未跟踪和跟踪的文件......显然包括开发和生产数据库!

我该怎么办? git clone并从上次提交重新开始?

Thomass-MacBook-Pro:livebytransit tomb$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    app/assets/javascripts/.txt
    app/assets/javascripts/shared/

nothing added to commit but untracked files present (use "git add" to track)
Thomass-MacBook-Pro:livebytransit tomb$ git clean -n
Would remove app/assets/javascripts/.txt
Thomass-MacBook-Pro:livebytransit tomb$ git clean -fx
Removing app/assets/javascripts/.txt
Removing db/development.sqlite3
Removing db/production.sqlite3
Removing log/development.log
Removing log/production.log
4

1 回答 1

2

首先,git clean只能删除未跟踪的文件。它不能删除跟踪的文件(即使您刚刚git add对文件进行了操作,它也变得不可触及git clean)。根据定义,任何未跟踪的文件都不能被 git 恢复,因为 git 只是不知道它们。如果您之前跟踪过它们,您可以查看该文件的过去版本

其次,您运行的 2 个命令并不相同:该-x标志指示 git 删除所有未跟踪的文件(甚至那些被各种.gitignores 忽略的文件)。这就是导致您的问题的原因。

当您的第一个命令 ( git clean -n) 向您显示文件时,它会忽略gitignore规则指定的那些文件,而第二个命令 ( git clean -fx) 也包括那些因-x标志而删除的文件。因此,所有未跟踪的文件都将被删除——无论是否被忽略gitignore

将来,您应该执行:git clean -f仅当您想要所需的行为时。

现在,如果需要,您应该db/*.sqlite从备份/其他开发人员/通过数据库迁移获取文件。这些*.log文件应该有望由您的开发设置自动生成,如果没有,只需创建具有名称的空文件。

引用文档

$ man git-clean

从当前目录开始,通过递归删除不受版本控制的文件来清理工作树。

-x

不要使用从 .gitignore(每个目录)和 $GIT_DIR/info/exclude 读取的标准忽略规则,但仍然使用 -e 选项给出的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。

-n, --dry-run

实际上不要删除任何东西,只是显示将要做什么。

-f, --force

如果 Git 配置变量 clean.requireForce 没有设置为 false,git clean 将拒绝删除文件或目录,除非给定 -f、-n 或 -i

于 2018-04-08T03:35:00.930 回答