如果我运行gitbranch-d XYZ,是否有方法恢复该分支?有没有办法像我没有运行delete branch命令一样返回?
当前回答
如果您没有reflog,例如,因为您正在一个未启用reflog的裸存储库中工作,并且您要恢复的提交是最近创建的,另一个选项是查找最近创建的提交对象并查看它们。
在.git/objects目录内运行:
find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit
这将查找在过去12小时内创建的所有对象(提交、文件、标记等),并对其进行筛选以仅显示提交。检查这些是一个快速的过程。
不过,我会先尝试Jakub的回答中提到的git-request.sh脚本。
其他回答
当提交在reflog中时
大多数时间无法访问的提交都在reflog中。因此,首先要尝试使用命令git reflog(它显示HEAD的reflog)查看reflog。
如果提交是一个特定且仍然存在的分支的一部分,那么使用命令git reflog名称可能会更简单。它也适用于远程设备,例如,如果您使用了强制推送(尽管应该使用gitpush-forcewithlease,这样可以防止错误,并且更容易恢复)。
当他们不在reflog中时
如果您的提交不在reflog中(可能它们被不写入reflog的第三方工具删除了),您可以先尝试使用此命令创建一个包含所有悬空提交的文件
git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt
然后读取缺失提交的SHA并将分支重置为它。
经常使用的用户可以使用
git config --global alias.rescue '!git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt'
下面是一些示例,说明如何分析找到的提交
显示提交元数据(作者、创建日期和提交消息):
git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
另请参见差异:
git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
在找到的提交上创建分支:
git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560
Windows GUI可以通过菜单Repository=>Git maintenance=>recover lost objects。。。
相关:轻松恢复以前暂存的已删除文件
我从远程重新创建了一个分支,试图清除一些我不想要的提交,并准备选择我想要的正确提交。当然我把SHA写错了。。。
以下是我发现它们的方式(主要是从这里的答案中获得更简单的界面/交互):
首先,在日志中生成一个松散提交列表。尽快执行此操作并停止工作,因为垃圾收集器可能会丢弃这些垃圾。
git fsck --full --no-reflogs --unreachable --lost-found > lost
这将创建一个丢失的文件,其中包含您必须查看的所有提交。为了简化我们的生活,让我们只从中删除SHA:
cat lost | cut -d\ -f3 > commits
现在,您有了一个提交文件,其中包含您必须查看的所有提交。
假设您正在使用Bash,最后一步:
for c in `cat commits`; do git show $c; read; done
这将向您显示它们各自的差异和提交信息。等待您按Enter键。现在写下所有你想要的,然后把它们摘下来。完成后,只需按Ctrl-C键。
如果删除了分支并忘记了它的提交id,可以执行以下命令:
git log --graph --decorate $(git rev-list -g --all)
之后,您将能够看到所有提交。然后,您可以对这个id执行git签出,并在这个提交下创建一个新的分支。
要恢复已删除的分支,请首先查看reflog历史记录,
git reflog -n 60
其中n表示最后n次提交。然后找到合适的头部并用该头部创建一个分支。
git branch testbranch HEAD@{30}
大的是
如果您正在使用GIT遵循以下简单步骤https://confluence.atlassian.com/bbkb/how-to-restore-a-deleted-branch-765757540.html
如果您正在使用smartgit并已经推送该分支转到原点,找到该分支,然后右键单击,然后签出
推荐文章
- 当我试图推到原点时,为什么Git告诉我“没有这样的远程‘原点’”?
- 如何从远程分支中挑选?
- 如何查看一个分支中的哪些提交不在另一个分支中?
- 如何取消在github上的拉请求?
- HEAD和master的区别
- GIT克隆在windows中跨本地文件系统回购
- RPC失败;卷度传输已关闭,剩余未完成的读取数据
- 我应该在.gitignore文件中添加Django迁移文件吗?
- 错误:您对以下文件的本地更改将被签出覆盖
- Git rebase—即使所有合并冲突都已解决,仍然会继续报错
- 在Git中,我如何知道我的当前版本是什么?
- 跟踪所有远程git分支作为本地分支
- 自定义SSH端口上的Git
- git如何显示不存在于.gitignore中的未跟踪文件
- Git错误:遇到7个文件应该是指针,但不是