如何恢复在gitcheckout-b之后消失的文件



我做了以下操作:

  1. git克隆[fork]
  2. 工作了几天,创建了新文件1&2
  3. git添加新文件1
  4. git添加新文件2
  5. git checkout-b new_branch
  6. git签出主机

在这一点上,我预计newfile1和newfile2会在等我,但事实并非如此。一切都恢复到了原来的主服务器,就像当前github服务器上的一样。

我的工作在等我吗?还是它变成了一堆回收的碎片?

重复您的步骤后,我的git status显示

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   newfile1
#       new file:   newfile2
#

这意味着,你对你的存储库做了一些其他的事情,你认为这些事情既不重要,也没有潜在的危害。

现在来谈谈你的实际问题:是的,你也许能做到

  • 首先对.git目录进行完整备份
  • 使用此脚本创建文件all-objects.sh(来源:https://gist.github.com/ctindall/4588884)

    #!/bin/sh
    set -e
    cd "$(git rev-parse --show-cdup)"
    # Find all the objects that are in packs:
    if [ "$(ls -A .git/objects/pack)" ]
    then
        for p in .git/objects/pack/pack-*.idx
            do
                    git show-index < $p | cut -f 2 -d ' '
            done
    fi
    # And now find all loose objects:
    find .git/objects/ | egrep '[0-9a-f]{38}$' | 
      sed -r 's,^.*([0-9a-f][0-9a-f])/([0-9a-f]{38}),12,'
    
  • 如果您在Linux/Mac上:使其可执行:chmod a+x all-objects.sh
  • 记住丢失数据的一小部分(字符串、方法名…)
  • 在以下脚本中查找此部件更改grep参数

    for rev in $(./s.sh) ; do
      C=$(git show $rev | grep <METHOD_NAME_OR_SOMETHING_FROM_MISSING_FILE> )
      if [[ "$C" != "" ]] ; then
        echo $rev
        echo $C
      fi
    done
    

相关内容

最新更新