如果我运行gitbranch-d XYZ,是否有方法恢复该分支?有没有办法像我没有运行delete branch命令一样返回?
当前回答
是的,您应该能够执行git reflog(无缩写),并在已删除分支的顶端找到提交的SHA1,然后只需git checkout[sha]。一旦您完成了提交,就可以使用gitcheckout-b[branchname]从那里重新创建分支。
感谢@Cascabel的这款浓缩/单内胆版本,以及@Snowscrash如何获得sha。
如果你刚刚删除了分支,你会在你的终端中看到类似这样的内容:deleted branch<your branch>(was<sha>)。然后在这一行中使用<sha>:
git checkout -b <your-branch> <sha>
其他回答
最热门的解决方案实际上比要求的要多:
git checkout <sha>
git checkout -b <branch>
or
git checkout -b <branch> <sha>
将您移动到新的分支,以及您可能忘记提交的所有最近更改。这可能不是你的意图,尤其是在失去分支后处于“恐慌模式”时。
一个更干净(更简单)的解决方案似乎是一行(在使用git-relog找到<sha>之后):
git branch <branch> <sha>
现在,当前分支和未提交的更改都不受影响。相反,只会创建一个新分支,直到<sha>。
如果这不是提示,它仍然有效,并且您得到了一个较短的分支,那么您可以使用新的<sha>和新的分支名称重试,直到正确为止。
最后,您可以将成功恢复的分支重命名为其名称或其他名称:
git branch -m <restored branch> <final branch>
不用说,成功的关键是找到正确的承诺<sha>,所以明智地命名你的承诺:)
当提交在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。。。
相关:轻松恢复以前暂存的已删除文件
仅仅使用git-relog并没有为我返回sha。只有提交id(8个字符长,sha长得多)
所以我用git-relog--无缩写
然后执行上述操作:git checkout-b<branch><sha>
如果删除了分支并忘记了它的提交id,可以执行以下命令:
git log --graph --decorate $(git rev-list -g --all)
之后,您将能够看到所有提交。然后,您可以对这个id执行git签出,并在这个提交下创建一个新的分支。
我使用以下命令来查找和检索已删除的分支。第一步来自gcb的描述。
$ git fsck --full --no-reflogs --unreachable --lost-found > lost
$ cat lost | cut -d\ -f3 > commits
$ cat commits | xargs -n 1 git log -n 1 --pretty=oneline
现在根据提交注释查找gitcommit-id(git-SHA),并在下面的命令中使用它。使用之前找到的GIT-SHA签出一个名为new-branch的新分支:
$ git checkout -b NEW-BRANCH GIT-SHA
推荐文章
- Git分支之间的视觉差异
- 在GitHub中编辑git提交消息
- 是否有可能' git状态'只修改文件?
- Git:如何区分两个不同的文件在不同的分支?
- 如何从远程Git存储库中提取并覆盖本地存储库中的更改?
- Github:导入上游分支到fork
- Mercurial:我可以重命名分支吗?
- Git单次修订的日志
- Git在不改变提交时间戳的情况下进行改基
- VS 2017 Git本地提交数据库。每次提交时锁定错误
- 如何在过去的一些任意提交之间注入一个提交?
- 从GitHub克隆项目后拉git子模块
- GitHub上的分叉和克隆有什么区别?
- 递归地按模式添加文件
- 我如何使用notepad++(或其他)与msysgit?