为什么git pull不能恢复我删除的目录?

46

我今天刚开始学习如何使用git,进展顺利。

作为一个实验,我使用push上传了两个目录(每个目录包含两个文件)和根目录下的两个文件。这一步进行得很顺利。

然后我删除了本地拥有但未上传至Git的两个目录之中的一个。当我使用git status时,它似乎意识到了这一点:

deleted: test/Testfile.as
deleted: test/Testile2.as

但是当我使用git pull获取我的文件时,它们似乎没有返回到我的本地文件夹。我也尝试过git fetch

唯一似乎可以让我重新获取所有文件的方法是使用git clone,但这似乎并不合逻辑,因为我需要先删除我的主目录,然后再将其克隆回来(或者选择一个新位置放置克隆的文件)。

什么是从Github下载已在本地删除的文件和文件夹的正确方式?


1
你可能不明白的一个关键概念是,推送(push)和拉取(pull)是在远程仓库和本地仓库之间转移“提交(commits)”。如果你想处理工作目录与当前检出的提交之间的差异,那是完全本地的操作。 - Cascabel
5个回答

63

git pull仅在您的工作目录中合并获取的提交,不会恢复已删除的目录(但可能会警告您存在冲突)。

如果您已经在工作目录中删除了文件夹,则需要执行以下操作:

git checkout -- test

要将其恢复,您可以执行git reset --hard以完全将工作目录带回HEAD状态。


谢谢,这个方法可行。在这个问题的背后,为什么我本地删除了目录后,在git push之后,git上的目录没有被删除呢? - Marty
@MartyWallace - 你需要执行 git rm 并将删除操作暂存,然后提交并推送。 - manojlds
这个答案可以更清晰地表述,因为命令 git checkout -- test 只会恢复 test 目录中的文件,但没有有用的命令行反馈(它们只是重新出现)。通用命令 git checkout 将为您提供一个有用的本地删除文件列表。请注意,git checkout -- . 将从根目录恢复。 - yeliabsalohcin

14

你想将代码库返回到之前可用的版本,这就是git-reset要做的工作。

git reset --hard

请务必仔细阅读这个有用的git-reset解释

如果你想的话,也可以查看那些文件:

git checkout -- test/

3

git pull会合并更改。想象一下你修改的文件。如果你修改了文件,git pull不会用远程副本替换文件的内容。即使存在冲突的更改,它也只会警告您有一个快进。

如果您的存储库处于仅删除未提交更改的状态,并且您想要撤消此更改,则执行 git reset head --hard

或者,如果您想要保留其他更改,请执行 git checkout -- test


1
除了 git pullgit checkoutgit revert 也可以帮助恢复已删除的文件。

-1

git reset --hard <commit hash> 的意思是将 HEAD 指向特定的提交,而在该提交哈希之后所做的任何提交都将不可用。这是因为您正在将 HEAD 指向单独的提交哈希。如果您强制推送,则会丢失所有提交。

注意:在 Git 中使用 git reset --hard 命令时要小心。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接