我不小心使用git filter-branch从我的仓库中删除了一个文件:
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch images/thumb/a.JPG' HEAD
我该如何撤销这个操作?是否可以实现?也就是说,文件被永久删除了吗?
我不小心使用git filter-branch从我的仓库中删除了一个文件:
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch images/thumb/a.JPG' HEAD
我该如何撤销这个操作?是否可以实现?也就是说,文件被永久删除了吗?
git filter-branch
命令时,会在当前目录下创建一个备份文件。refs/original/refs/heads/master
git reset --hard refs/original/refs/heads/master
fatal: Cannot do hard reset with paths.
,所以我先执行了 git reflog
命令,并找到了一行 HEAD@{integer}: filter-branch: rewrite
,然后我记录下了这个整数,接着执行了 git reset --hard HEAD@{integer}
命令,之后问题就解决了。 - hermanscgit reset --hard HEAD@{integer}
之后加入了git push -f
。 - kilojoulesgit filter-branch
命令从我们的代码库中删除某人意外提交的库所导致的大量行。因此,在图表中,它显示了大约8000行的添加/删除,我认为filter-branch会重写这些行,然后更新图表,但实际上并没有。反而是将所有行数翻倍了。那么,执行此操作是否会将行数恢复到旧状态?还是会再次翻倍? - Arian Faurtosh可能比直接硬重置回原始主分支更合适的方法是恢复git filter-branch
重写的所有参考,并且甚至删除备份参考,以便能够再次调用git filter-branch
而不需要--force
:
for orig_ref in $(git for-each-ref --format="%(refname)" refs/original/); do
git update-ref "${orig_ref#refs/original/}" $orig_ref
git update-ref -d $orig_ref # to also remove backup refs
done
之后:
git reset --hard master
以下是(可能)更加符合 Git 风格且无需使用 shell 循环执行相同操作的方法:
git for-each-ref --format="update %(refname:lstrip=2) %(objectname)" refs/original/ | git update-ref --stdin
git for-each-ref --format="delete %(refname) %(objectname)" refs/original/ | git update-ref --stdin
git fetch . +refs/original/*:*
? - Mr_and_Mrs_Dgit fetch . +refs/original/*:*
如上述答案所述,如果要恢复当前检出的分支,则可能需要分离HEAD。
要删除refs/original
引用,请执行以下操作:
git for-each-ref refs/original --format='delete %(refname) %(objectname)' | git update-ref --stdin