git checkout HEAD~2(示例)删除未跟踪的文件(如果它们是在上次提交时添加的)

时间:2010-09-13 10:14:59

标签: git git-checkout

我添加新文件(之前作为未跟踪文件存在)并提交它们。当我在此提交之前结帐时,这些文件将被删除。他们不应该。

.gitignore是否列出这些文件无关紧要(需要执行git add -f ...)。

4 个答案:

答案 0 :(得分:3)

  

他们不应该[被删除]。

是的,他们应该。提交是历史状态。你在犯罪之前检查了一个州,所以他们不应该在那里。想象一下从现在开始一年的项目工作。一半的文件已被重命名,有几十个新文件,无论出于何种原因你决定查看今天的版本。当然,你不会希望所有这几十个文件只是坐在那里杂乱无章!他们不属于那里! (当然“未跟踪的文件......添加了最后一次提交”没有任何意义 - 如果你提交了它们,它们现在被跟踪了。)

如果真正的文件已经在旧提交中,那么您可能想要做的就是使用交互式rebase(git rebase -i <start commit> <branch>,git提供的进一步说明)来压缩一对一起承诺。也许您还需要对提交进行重新排序,将“添加这些文件”提交回其所属的历史记录中。或者,如果您在忘记添加文件后立即注意到这一点,只需添加它们并使用commit --amend修改为先前的提交,而不是创建单独的提交。

最后,如果你确实以这种方式在历史记录中获得了这个集合(其他人已经拉了所以你不想重新定义/修改),你可以查看旧的提交,然后查看更新的文件提交:

git checkout <old-commit>
git checkout <new-commit> file1 file2 dir1 dir2/file3 ...

答案 1 :(得分:2)

再次结帐HEAD,你就会收到这些文件。 Git checkout HEAD~2将您的存储库目录恢复为您之前提交过两次提交的跟踪状态。这完全是预期的行为。

答案 2 :(得分:0)

当最后一次提交仅包含文件添加时可能的解决方案:

$ git diff HEAD^ >diff
$ git checkout HEAD^
$ git apply diff

此时分支已分离并包含以前未跟踪的文件。从现在开始,可以在提交历史记录中进一步检出并保持一致。

答案 3 :(得分:0)

您可能希望git commit --amend能够解决您忘记的上一次提交的问题。