繁体   English   中英

git pull实际上并没有从远程恢复丢失的文件

[英]git pull doesn't actually restore my missing files from remote

我一直在分支机构工作。 我承诺并将其推送到远程存储库。 现在,该分支上的一些文件丢失了。 希望他们仍然可以在远程分支上使用,所以我试着做git pull

git pull origin feature/my_branch

但是,git说所有都与远程同步:

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

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

git pull对应于git fetch的序列,然后是git merge 因此,如果从本地存储库中删除文件,执行git 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

假设你已经正确地描述了这个问题,@ 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

暂无
暂无

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

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