如何恢复git checkout -b后消失的文件

时间:2013-12-02 22:24:51

标签: git

我做了以下事情:

  1. git clone [fork]
  2. 工作了几天,创建了新文件1& 2
  3. git add newfile1
  4. git add newfile2
  5. git checkout -b new_branch
  6. git checkout master
  7. 此时,我希望newfile1和newfile2等待我,但他们不是。一切都已恢复到原始主服务器,就像当前在github服务器上一样。

    我的工作在某个地方等我吗?或者它变成了一堆回收的东西?

1 个答案:

答案 0 :(得分:3)

重复您的步骤后,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}),\1\2,'
    
  • 如果您使用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