繁体   English   中英

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

[英]git checkout HEAD~2 (example) deletes untracked files if they were added with last commit

我添加新文件(以前以未跟踪文件的形式存在)并提交它们。 当我在此提交之前检出时,这些文件将被删除。 他们不应该。

.gitignore是否列出这些文件都没有关系(这需要执行git add -f ...)。

他们不应该[被删除]。

是的,他们应该。 提交是历史状态。 您在提交状态之前先检查状态,因此它们不应在那里。 试想一下,从现在开始一年后就在您的项目上工作。 文件的一半已重命名,有数十个新文件,无论出于何种原因,您都决定签出当前版本。 当然,您不希望所有这些几十个文件都只是摆放并弄乱它! 他们不属于那里! (当然,“未跟踪的文件...添加了最后的提交”没有任何意义-如果您提交了它们,现在将对其进行跟踪。)

如果文件确实应该在旧提交中,则可能要做的是使用交互式rebase( git rebase -i <start commit> <branch> ,由git提供进一步的说明)将几个提交挤在一起。 也许您也需要重新排列提交的顺序,将“添加这些文件”提交推回到其所属的历史记录中。 或者,如果您在忘记添加文件后立即注意到这一点,只需添加它们并使用commit --amend修改为上一个提交,而不用创建单独的提交。

最后,如果您确实通过这种方式在历史记录中获得了此设置(其他人已经撤消了,因此您不想进行基准/修改),则可以检出旧的提交,然后从较新的提交中检出文件:

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

只需再次检出HEAD,即可将这些文件退回。 Git结帐HEAD〜2将您的存储库目录恢复为之前两次提交的跟踪状态。 这完全是预期的行为。

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

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

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

您可能希望git commit --amend将内容添加到您忘记的上一个提交上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM