32

我一直在一个分支上工作。我提交并将其推送到远程存储库。现在该分支上的一些文件丢失了。希望它们在远程分支上仍然可用,所以我尝试这样做git pull

git pull origin feature/my_branch

但是,git 说一切都与远程同步:

 * branch            feature/my_branch -> FETCH_HEAD
Already up-to-date.

这怎么可能是最新的?我在本地找不到丢失的文件,并且由于这些丢失的文件,我的项目没有编译。同样,我可以在 bitbucket 上的远程分支的提交历史记录中看到这些文件。

4

2 回答 2

33

git pull对应于 agit fetch和 then的序列git merge。因此,如果您从本地存储库中删除文件,执行 agit pull 将不会恢复它们。

为了恢复它们,您需要使用以下命令从远程存储库中签出该文件:

git checkout <branch name> -- <path/to/file>

<branch name>可以是本地的或远程的。

示例:使用远程存储库

  1. 远程上游名称: origin
  2. 远程分支: feature/xpto
  3. 本地分支: feature/xpto
  4. 本地分支上缺少文件: example.js
  5. 将文件从远程分支恢复到本地分支: git checkout origin/feature/xpto -- example.js
  6. 现在您example.js又回到了本地分支机构

示例 2:回滚提交

  1. git log
  2. 当前提交哈希7bb2154cf23b68feb0a0bbbd95446f2cd8bf3a44
  3. 想要回滚到这个提交哈希dbc04c23b2c6f2dd7bc9b5ef4aef22611a57c3ad
    • git checkout dbc04c23b2c6f2dd7bc9b5ef4aef22611a57c3ad
  4. 只想example.js从上面的提交哈希 中恢复文件
    • git checkout dbc04c23b2c6f2dd7bc9b5ef4aef22611a57c3ad -- example.js
于 2013-05-29T01:15:58.690 回答
8

假设您已经正确描述了问题,@danielcsgomes 的方法应该可以正常工作。

您可以通过运行git status. 例如(-s用于保持输出简短):

$ rm structy.py
$ git status -s
 D structy.py

只取回那个文件:

$ git checkout -- structy.py

它回来了。

有时简单地检查一些其他分支或修订,然后回到原来的位置,就可以解决问题。例如,这里最近的提交master是添加mp.py,所以如果我这样做:

$ rm mp.py
$ git status -s
 D mp.py
$ git checkout HEAD^
Note: checking out 'HEAD^'.
[verbiage about detached HEAD etc, snipped]
$ git checkout master
Previous HEAD position was 171ce6f... ignore *.log files
Switched to branch 'master'
$ git status -s
$ head -1 mp.py
from multiprocessing import Process, Queue

但这并不总是有效。它的工作原理是mp.py因为以前的 rev ( HEAD^) 没有它,而当前的 ( master) 有,所以从HEAD^master恢复文件。该文件structy.py已经存在了很长一段时间,所以如果我删除它并签出HEAD^或其他一些分支或其他任何东西,它仍然是从工作目录中删除的。所以类似的东西git checkout -- structy.py是一种更简单的方法来恢复它,除非你想选择非常大的锤子:git reset --hard.

如果您确定要放弃所做的任何更改,您可以git reset --hard HEAD. 例如,考虑:

$ git rm mp.py
rm 'mp.py'
$ git status -s
D  mp.py

(顺便说一句,请注意“D”在这里的位置不同:我“git rm”ed,而不仅仅是“rm”ed,所以我告诉 git,如果我进行提交,mp.py 应该是在新提交中删除,我删除它不仅仅是一个意外)。然后我决定,不,这是错误的,我希望一切都回到 HEAD 中的方式:

$ git reset --hard HEAD
HEAD is now at 523bacb add multiprocessing example
$ git status -s
$ 

所以,只有reset --hard在你非常确定的情况下才使用。

于 2013-05-29T05:21:42.823 回答