如果我运行git branch -d XYZ
,有没有办法恢复分支?有没有办法可以返回,好像我没有运行delete branch命令?
答案 0 :(得分:1646)
是的,您应该能够git reflog
并在已删除分支的顶端找到提交的SHA1,然后只需git checkout [sha]
。一旦你进行了提交,你就可以git checkout -b [branchname]
从那里重新创建分支。
归功于@Cascabel这个浓缩/单行版本。
您可以一步完成:
git checkout -b <branch> <sha>
答案 1 :(得分:124)
大部分时间无法访问的提交都在reflog中。所以,首先要尝试的是使用命令git reflog
查看reflog (显示HEAD
的reflog)。
如果提交是仍然存在的特定分支的一部分,则可能更容易使用命令git reflog name-of-my-branch
。它也适用于遥控器,例如,如果您强制推动。
如果您的提交不在您的reflog中(可能是因为没有在reflog中写入的第三方工具删除),我通过将我的分支重新设置为sha成功恢复了分支使用类似的命令找到提交(它创建一个包含所有悬空提交的文件):
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 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 rescue
要调查找到的提交,您可以使用一些命令显示每个提交以查看它们。
显示提交元数据(作者,创建日期和提交消息):
git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
另见diffs:
git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
找到提交后,在此提交上创建一个分支:
git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560
答案 2 :(得分:38)
如果您想使用GUI,可以使用gitk执行整个操作。
gitk --reflog
这将允许您查看分支的提交历史记录,就好像分支尚未删除一样。现在只需右键单击对分支的最新提交,然后选择菜单选项Create new branch
。
答案 3 :(得分:18)
最高投票解决方案确实超过了要求:
git checkout <sha>
git checkout -b <branch>
或
git checkout -b <branch> <sha>
将您带到新分支以及您可能忘记提交的所有最近更改。这可能不是你的意图,尤其是在恐慌模式下#34;失去分支后。
更清洁(和更简单)的解决方案似乎是一行代表(在<sha>
找到git reflog
之后):
git branch <branch> <sha>
现在,您当前的分支和未经修改的更改都不会受到影响。相反,只会创建一个新的分支,一直到<sha>
。
如果它不是提示,它仍然可以工作,你得到一个更短的分支,然后你可以重新使用新的<sha>
和新的分支名称,直到你做对了。
最后,您可以将成功恢复的分支重命名为它的名称或其他任何内容:
git branch -m <restored branch> <final branch>
毋庸置疑,成功的关键是找到正确的提交<sha>
,所以明智地命名你的提交:)
答案 4 :(得分:14)
添加到tfe answer:Git源代码的contrib/
区域(git.git存储库)中还有 git-resurrect.sh 脚本,帮助你。
git-resurrect <name>
试图找到分支尖端的痕迹 叫<name>
,并尝试复活它。目前,reflog是 搜索了结帐消息,-r
也合并了消息。同-m
和-t
,会针对Merge <name> into other
/Merge <other> into <name>
(分别)提交主题扫描所有引用的历史记录, 相当慢,但允许你复活其他人的话题 分支。
答案 5 :(得分:9)
如果您没有reflog,例如。因为您正在一个裸存储库中工作,该存储库没有启用reflog,并且最近创建了要恢复的提交,另一个选项是查找最近创建的提交对象并查看它们。
从.git/objects
目录中运行:
find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit
查找过去12小时内创建的所有对象(提交,文件,标签等)并过滤它们以仅显示提交。检查这些是一个快速的过程。
我首先尝试Jakub's answer中提到的git-ressurect.sh脚本。
答案 6 :(得分:9)
对于未安装Git的GitHub用户:
如果您想从GitHub网站恢复,可以使用他们的API 获取与回购相关的活动列表:
<强>第一强>
找到那些SHA(提交哈希):
curl -i https://api.github.com/repos/PublicUser/PublicRepo/events
...或私人回购:
curl -su YourUserName https://api.github.com/repos/YourUserName/YourProject/events
(将提示输入GitHub密码)
下一步强>
•转到分支机构并删除该分支机构。
•在同一页面上,无需重新加载,打开DevTools,网络面板。现在准备......
•单击“还原”。你会注意到一条新的“线”。右键单击它并选择“Copy as cURL”并将此文本保存在某个编辑器中。
•附加到复制的代码行的末尾,这一行:-H "Cookie="
。
你现在应该得到类似的东西:
curl 'https://github.com/UserName/ProjectName/branches?branch=BranchSHA&name=BranchName' -H 'Cookie:' -H 'Origin: https://github.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US' -H 'User-Agent: User-Agent' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Accept: */*' -H 'Referer: https://github.com/UserName/ProjectName/branches' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' --data 'utf8=%E2%9C%93&authenticity_token=token' --compressed
最后一步
<强> P.S。强>
我意识到这可能不是“最简单的解决方案”或“正确”的解决方案,但是如果有人发现它有用的话,它会被提供。
答案 7 :(得分:8)
我使用以下命令查找和检索已删除的分支。第一步来自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
现在根据提交注释查找git commit id(GIT-SHA),并在下面的命令中使用它。使用之前找到的GIT-SHA签出一个名为NEW-BRANCH的新分支:
$ git checkout -b NEW-BRANCH GIT-SHA
答案 8 :(得分:7)
根据我的理解,如果另一个分支可以访问要删除的分支,您可以使用
安全地删除它git branch -d [branch]
你的工作不会丢失。请记住,分支不是快照,而是指向快照的指针。因此,当您删除分支时,您将删除指针。
如果删除另一个分支无法访问的分支,您甚至不会丢失工作。当然,它不会像检查提交哈希那么容易,但你仍然可以做到。这就是为什么Git无法删除使用-d
无法访问的分支的原因。相反,你必须使用
git branch -D [branch]
这是Scott Chacon关于Git的必看视频的一部分。当他谈到分支机构以及如何删除它们时,请在58:00分钟检查。
答案 9 :(得分:4)
我从远程重新设计了一个分支机构,试图清除一些我不想要的提交,并准备挑选出我想要的正确的提交。当然我写错了......
以下是我发现它们的方式(这里的答案主要是一个更简单的界面/互动):
首先,在日志中生成一个松散提交列表。尽快这样做并停止工作,因为那些可能被垃圾收集器抛弃。
git fsck --full --no-reflogs --unreachable --lost-found > lost
这将创建一个lost
文件,其中包含您必须查看的所有提交。为了简化我们的生活,我们只剪切它的SHA:
cat lost | cut -d\ -f3 > commits
现在您有一个commits
文件,其中包含您需要查看的所有提交。
假设您正在使用Bash,那么最后一步是:
for c in `cat commits`; do git show $c; read; done
这将显示每个文件的差异和提交信息。等你按 Enter 。现在写下你想要的所有内容,然后挑选它们。完成后,只需按Ctrl-C即可。
答案 10 :(得分:3)
要恢复已删除的分支,请首先查看reflog历史记录
git reflog -n 60
其中n表示最后n次提交。然后找到合适的头部并用头部创建一个分支。
git branch testbranch HEAD@{30}
答案 11 :(得分:2)
是的
如果您使用的是GIT 遵循以下简单步骤 https://confluence.atlassian.com/bbkb/how-to-restore-a-deleted-branch-765757540.html
如果您使用的是smartgit,并且已经推送了该分支 转到原点,找到该分支,然后右键单击然后结帐
答案 12 :(得分:1)
添加到tfe的答案,您可以使用上述过程进行恢复,除非它的提交不是垃圾回收。 Git branch只是指向提交树中特定提交的指针。但是如果删除指针,并且该分支上的提交没有合并到其他现有分支中,那么git会将其视为悬空提交,并在垃圾收集期间将其删除,它可能会定期自动运行。
如果您的分支未合并到现有分支,并且它是垃圾收集,那么您将松开所有提交,直到分支从现有分支分叉的位置。
答案 13 :(得分:1)
相关问题: 我在搜索“如何知道删除的分支是什么”之后来到这个页面。
在删除许多旧分支时,我觉得我错误地删除了一个较新的分支,但不知道恢复它的名称。
要了解最近删除的分支,请执行以下操作:
如果你转到你的Git URL,它将如下所示:
https://your-website-name/orgs/your-org-name/dashboard
然后,您可以在最近的过去看到由哪些人删除的内容。
答案 14 :(得分:1)
首先转到git批处理移动到你的项目,如:
cd android studio project
cd Myproject
then type :
git reflog
你们都有一个更改列表,参考号码取自参考编号,然后从android studio或git betcha结账。 另一个解决方案取ref编号并转到android studio点击git branches down然后点击checkout标签或修改过去的参考号然后lol你有分支。
答案 15 :(得分:0)
请确保在本地执行所有这些操作,并在推送到Bitbucket Cloud之前确认您的存储库处于所需状态。克隆您当前的仓库,并首先测试这些解决方案也是一个好主意。
如果您刚刚删除了分支,您将在终端中看到类似的内容:
已删除的分支(是)
2。要还原分支,请使用:
git checkout -b
如果您不知道脑袋上方的“影子”,可以:
使用以下命令在已删除分支的顶端找到提交的“ sha”:
git reflog
要还原分支,请使用:
git checkout -b
如果您的提交不在您的参考日志中:
您可以尝试通过以下命令将分支重置为找到的提交的阴影,以尝试恢复分支:
git fsck --full --no-reflogs --unreachable --lost-found | grep提交|切-d \ -f3 | xargs -n 1 git log -n 1 --pretty = oneline> .git / lost-found.txt
2。然后,您可以使用以下任一显示每次提交:
git log -p git cat-file -p
答案 16 :(得分:0)
仅使用git reflog
并没有为我返回sha
。
仅commit id
(长度为8个字符,而sha更长)
所以我用
git reflog --no-abbrev
然后执行与上述相同的操作:
git checkout -b <branch> <sha>
答案 17 :(得分:0)
我在删除分支的计算机上执行了此操作:
git reflog
响应:
74b2383 (develope) HEAD@{1}: checkout: moving from master to develope
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{2}: checkout: moving from develope to master
74b2383 (develope) HEAD@{3}: checkout: moving from master to develope
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{4}: reset: moving to HEAD
40ef328 (HEAD -> master, origin/master, origin/HEAD) HEAD@{5}: clone: from http://LOCALGITSERVER/myBigProject/Android.git
我使用以下命令检索分支:
git checkout -b newBranchName 74b2383
答案 18 :(得分:0)
请注意,git branch delete仅删除本地副本,而不删除服务器上的副本。首先,在Git面板(左侧工具栏上的git图标)中,浏览分支并查看分支在“ origin / your_branch_name”下是否仍然存在。如果是这样,只需选择该选项,您就应该找回代码(建议您立即将其复制/粘贴/保存在其他地方)。
如果没有看到“ origin / your_branch_name”,请安装GitLens扩展名。这使您可以直观地在服务器存储库中四处浏览,并找到同步到服务器的副本。如果您有多个存储库,请注意,可能需要从所需的存储库中至少打开一个文件,以使该存储库出现在GitLens中。然后:
打开GitLens面板
扩展存储库
您应该看到以下类别的列表:分支机构/贡献者/遥控器/储藏品/等等
您应该在“分支”下或可能在“ Remote-> Origins”下找到YourLostTreasure。希望您会看到一个具有所需名称的分支-如果展开它,您应该会看到在该分支中更改的文件。双击文件名将其打开,然后立即备份该代码。
如果您没有立即看到丢失的分支,请四处寻找,如果发现有希望的东西,请立即打开它并获取代码。我不得不四处摸索,直到找到TheGoldenBranch,即使这样,代码也丢失了最后一两次保存(可能是因为在尝试进行“分支合并”之前,我未能同步到服务器,但偶然地单击了“删除分支)。我的搜索被不必要地延长了,因为当我第一次找到该分支时,我并不完全确定名称是否正确,因此一直在寻找,并且花了一些时间来重新找到第一个分支。 (因此,Carpe Carpum和 然后 继续看。)
答案 19 :(得分:0)
如果您删除了分支并忘记了它的提交ID,则可以执行以下命令:
git log --graph --decorate $(git rev-list -g --all)
此后,您将能够看到所有提交。
然后您可以对此ID进行git checkout
,并在此提交下创建一个新分支。
答案 20 :(得分:0)
如果您使用的是 Git 扩展
虽然很旧,但当您 google 恢复已删除的分支时,此线程是列表的顶部。我使用 git 扩展而不是命令行,所以我不熟悉这些命令,但是 reflog 命令给了我一个线索,所以我在这里发布我的 git 扩展解决方案,供其他使用 git 扩展的人使用读这个。
您删除的分支现在应该可以查看和选择,只需点击它并检查它。