如何完全放弃对主题分支所做的更改

How to completely discard changes made on a topic branch

在一个主题分支中,我错误地复制了一个模型和一个迁移(之前在 master 分支中创建):

rails generate model User name:string email:string 
bundle exec rake db:migrate

创建了重复模型但迁移失败,因为数据库已经有一个 users table。按照 how to discard git local branch changes? 中的说明,我尝试使用 git reset --hard 丢弃所有未提交的更改,但 git status 仍然显示存在未跟踪的文件:

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

    app/models/user.rb
    db/migrate/
    test/fixtures/users.yml
    test/models/user_test.rb

# nothing added to commit but untracked files present (use "git add" to track)

为什么 git reset --hard 保留这些文件?我该怎么做才能安全地删除这些文件,以便将主题分支完全重置为上次提交? rails destroy model User 适合我吗?

这些文件未被 git 跟踪(请注意它们在 git status 输出中的 "Untracked files" 下列出)。 git reset --hard 删除 git 跟踪的所有文件中的更改。从 documentationgit reset --hard:

Resets the index and working tree. Any changes to tracked files in the working tree since commit are discarded.

要删除它们,只需删除它们:

rm app/models/user.rb
rm db/migrate/
rm test/fixtures/users.yml
rm test/models/user_test.rb
git clean -f -d 

删除未跟踪的文件是最安全的选择。此外,您可以查看 this answer

正如@HBHB 所说:git reset --hard 重置刚刚跟踪的文件。

但是您也可以通过调用 git clean -df 使用 git 删除未跟踪的文件。 -d 也会删除未跟踪的目录,必须提供 -f(强制),否则 Git 不会删除文件。

我总是使用这个命令:

git reset --hard HEAD~1

rails git:(master) ✗ git reset --hard HEAD~1 HEAD is now at 45e2c462 Skip the pipeline for webpack