我做了以下操作:
- git克隆[fork]
- 工作了几天,创建了新文件1&2
- git添加新文件1
- git添加新文件2
- git checkout-b new_branch
- 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