在Git中删除后可以恢复分支吗?

时间:2010-09-04 03:25:20

标签: git branch git-branch

如果我运行git branch -d XYZ,有没有办法恢复分支?有没有办法可以返回,好像我没有运行delete branch命令?

21 个答案:

答案 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密码)

    • (如果回购需要双因素身份验证,请参阅下面对此答案的评论。)

下一步

  • 转到GitHub并创建一个新的临时分支,该分支将永久删除(最好Chrome)。

•转到分支机构并删除该分支机构。

在同一页面上,无需重新加载,打开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

最后一步

  • 将SHA-hash和BranchName替换为“BranchSHA”并使用所需名称(顺便说一句,从网上重命名分支是很好的黑客攻击)。如果你不是太慢,你无论如何都需要提出这个要求。例如,只需复制粘贴到终端。

<强> 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分钟检查。

Introduction to Git with Scott Chacon of GitHub

答案 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之前确认您的存储库处于所需状态。克隆您当前的仓库,并首先测试这些解决方案也是一个好主意。

  1. 如果您刚刚删除了分支,您将在终端中看到类似的内容:

    已删除的分支(是)

    2。要还原分支,请使用:

    git checkout -b

如果您不知道脑袋上方的“影子”,可以:

  1. 使用以下命令在已删除分支的顶端找到提交的“ sha”:

    git reflog

  2. 要还原分支,请使用:

    git checkout -b

如果您的提交不在您的参考日志中:

  1. 您可以尝试通过以下命令将分支重置为找到的提交的阴影,以尝试恢复分支:

    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)

如果您使用的是VSCode ... ,则在删除分支之前将分支与服务器进行了同步...

请注意,git branch delete仅删除本地副本,而不删除服务器上的副本。首先,在Git面板(左侧工具栏上的git图标)中,浏览分支并查看分支在“ origin / your_branch_name”下是否仍然存在。如果是这样,只需选择该选项,您就应该找回代码(建议您立即将其复制/粘贴/保存在其他地方)。

如果没有看到“ origin / your_branch_name”,请安装GitLens扩展名。这使您可以直观地在服务器存储库中四处浏览,并找到同步到服务器的副本。如果您有多个存储库,请注意,可能需要从所需的存储库中至少打开一个文件,以使该存储库出现在GitLens中。然后:

  1. 打开GitLens面板

  2. 扩展存储库

  3. 您应该看到以下类别的列表:分支机构/贡献者/遥控器/储藏品/等等

您应该在“分支”下或可能在“ 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 扩展的人使用读这个。

  1. 转到工具栏上的视图下拉菜单
  2. 选择显示引用日志

您删除的分支现在应该可以查看和选择,只需点击它并检查它。