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

pro*_*eek 1007 git branch git-branch

如果我跑git branch -d XYZ,有没有办法恢复分支?有没有办法回去,好像我没有运行删除分支命令?

tfe*_*tfe 1830

是的,您应该可以git reflog在已删除分支的末尾执行并找到提交的SHA1,然后只需git checkout [sha].一旦你进行了提交,你就可以git checkout -b [branchname]从那里重新创建分支.


感谢@Cascabel这个浓缩/单线版本.

您可以一步完成:

git checkout -b <branch> <sha>
Run Code Online (Sandbox Code Playgroud)

  • 你可以一步完成:`git checkout -b <branch> <sha>`. (456认同)
  • 快速提示 - 如果您刚刚删除了分支,您将在终端中看到类似的内容 - "已删除分支<您的分支>(是<sha>)".然后它非常简单 - 只需使用`<sha>`.例如,如上所述 - `git checkout -b <branch> <sha>` (191认同)
  • 使用`git reflog --no-abbrev`来查看默认缩写的完整`<sha>`. (40认同)
  • 是的,只需在你的终端向上滚动(除非你做了`CMD + K`) (6认同)
  • 对于像我这样的其他人,他们很难找到已删除分支的影子:我能够`git checkout remotes / origin / deleted_branch`。 (5认同)
  • 就我而言,该分支被另一位同事删除,因此提交也随之消失了。幸运的是,这个同事仍然在本地拥有分支机构,只需执行git checkout &lt;branch&gt; &amp;&amp; git push origin &lt;branch&gt;即可恢复分支机构。 (2认同)
  • 对于从SourceTree而不是从命令行删除的任何人,您都可以通过查看-&gt;显示命令历史来查找SHA1。找到“删除分支”命令,然后查找“已删除分支&lt;分支名称&gt;(是&lt;sha&gt;)”消息。 (2认同)
  • 对于 GitKraken:查看活动日志,您应该会看到如下条目:“在 &lt;sha&gt; 处删除引用 &lt;branch&gt;:已完成。” (2认同)
  • 我想将“master”重命名为“main”,然后合并“dev”中的更改。我的“dev”分支被自动删除,因为错误地将“master”重命名为“dev”(因为现有分支已经有这个名称)。这解决了我的问题。 (2认同)

Phi*_*ppe 148

大部分时间无法访问的提交都在reflog中.因此,首先要尝试的是使用命令查看refloggit reflog(显示reflog HEAD).

如果提交是仍然存在的特定分支的一部分,则可能更容易使用该命令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
Run Code Online (Sandbox Code Playgroud)

如果你应该多次使用它(或者想在某处保存它),你也可以使用该命令创建一个别名......

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'
Run Code Online (Sandbox Code Playgroud)

并使用它 git push --force-with-lease

要调查已发现的提交,您可以使用一些命令来显示每个提交以查看它们.

要显示提交元数据(作者,创建日期和提交消息):

git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
Run Code Online (Sandbox Code Playgroud)

要查看差异:

git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
Run Code Online (Sandbox Code Playgroud)

找到提交后,在此提交上创建一个分支:

git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560
Run Code Online (Sandbox Code Playgroud)

  • 巨大的帮助。我有一个丢失的提交,该丢失从未在我的本地回购中出现。您在那里的第一个命令帮助我在服务器上找到了它。+1 (2认同)
  • 你救了我的命。 (2认同)

nob*_*bar 45

如果您想使用GUI,可以使用gitk执行整个操作.

gitk --reflog
Run Code Online (Sandbox Code Playgroud)

这将允许您查看分支的提交历史记录,就好像分支尚未删除一样.现在只需右键单击对分支的最新提交,然后选择菜单选项Create new branch.


小智 25

第一种

git reflog
Run Code Online (Sandbox Code Playgroud)

在终端中。

之后,得到HEAD@{**number**}(例如HEAD@{12})。

现在输入:

git checkout -b 'branch_name' 'HEAD@{22}'
Run Code Online (Sandbox Code Playgroud)


Dmi*_*sev 23

最高投票解决方案确实超过了要求:

git checkout <sha>
git checkout -b <branch>
Run Code Online (Sandbox Code Playgroud)

要么

git checkout -b <branch> <sha>
Run Code Online (Sandbox Code Playgroud)

将您带到新分支以及您可能忘记提交的所有最近更改.这可能不是你的意图,特别是在失去分支后处于"恐慌模式"时.

一个清洁剂(和简单的)解决方案似乎是一个班轮(你找到后<sha>git reflog):

git branch <branch> <sha>
Run Code Online (Sandbox Code Playgroud)

现在,您当前的分支和未经修改的更改都不会受到影响.相反,只会创建一个新的分支直到<sha>.

如果它不是提示,它仍然可以工作,你得到一个更短的分支,然后你可以重新使用新的<sha>和新的分支名称,直到你做对了.

最后,您可以将成功恢复的分支重命名为它的名称或其他任何内容:

git branch -m <restored branch> <final branch>
Run Code Online (Sandbox Code Playgroud)

不用说,成功的关键是找到正确的提交<sha>,所以明智地命名你的提交:)


Jak*_*ski 14

添加到tfe回答:在Git源代码区域(git.git存储库)中还有git-resurrect.sh脚本contrib/,这可能对您有所帮助.

git-resurrect <name>试图找到一个被称为分支尖端的痕迹<name>,并试图复活它.目前,搜索结果日志以及-r合并消息.使用 -m-t,扫描所有引用的历史Merge <name> into other/ Merge <other> into <name>(分别)提交主题,这相当慢,但允许您复活其他人的主题分支.

  • 它真的有效吗?有人测试过吗? (2认同)

AHM*_*MED 10

谢谢大家。

我的问题是我删除了 GitLab(远程)和 GIT(本地)上的分支。

但不知何故我得到了我的提交,如下所示:

  1. 首先我得到了最后一次提交(SHA)
git log --graph --decorate $(git rev-list -g --all)

Run Code Online (Sandbox Code Playgroud)
  1. 我简单地检查了最后一个 SHA
git checkout <SHA>
Run Code Online (Sandbox Code Playgroud)
  1. 然后我通过输入创建了一个全新的分支(根据您的喜好命名)
git switch -c <branch-name> 

Run Code Online (Sandbox Code Playgroud)

然后我得到了我的提交,我再次推了分支

感谢上帝。

ps:不知何故(SHA)是提交代码


Rob*_*ght 9

如果您没有reflog,例如.因为您正在一个裸存储库中工作,该存储库没有启用reflog并且最近创建了要恢复的提交,另一个选项是查找最近创建的提交对象并查看它们.

.git/objects目录内部运行:

find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit
Run Code Online (Sandbox Code Playgroud)

这将查找在过去12小时内创建的所有对象(提交,文件,标签等),并过滤它们以仅显示提交.检查这些是一个快速的过程.

我首先尝试在Jakub的回答中提到的git-ressurect.sh脚本.


Max*_*rok 9

对于没有安装Git的GitHub用户:

如果你想从GitHub网站恢复它,你可以破解他们的网站;)

   •首先,找到那些SHA(提交哈希):

    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
Run Code Online (Sandbox Code Playgroud)

......或私人回购:

    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
Run Code Online (Sandbox Code Playgroud)

...(将提示密码)

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

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

   •   在同一页面上,无需重新加载,打开DevTools,网络面板.现在准备......

   •单击"还原".你会注意到一条新的"线".右键单击它并选择"复制为cURL"并将此文本保存在某个编辑器中.

   •附加到复制的代码行的末尾,这一行:curl -i https://api.github.com/repos/PublicUser/PublicRepo/events.

你现在应该得到类似的东西:

    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
Run Code Online (Sandbox Code Playgroud)

   •最后一步:将"BranchSHA"替换为SHA-hash,并将BranchName替换为所需名称(顺便说一下,从web重命名分支是很好的黑客攻击).如果你不是太慢,你无论如何都需要提出这个要求.例如,只需复制粘贴到终端即可.

PS

我知道,这不是一个非常简单的解决方案或正确的解决方案,但万一有人,没有root密码和虚拟机,在黑客马拉松期间需要做一些奇怪的事情吗?..这是完全真实的,所以谢谢你花时间还有祝你好运 :)

UPDATE

Ahaha,我很高兴万维网上的某个人找到了我的答案,实际上在阅读之后,发现它很有趣或有用,并且提升了我的思绪,疯狂和错误的练习答案:)这是一个美好的世界周围,​​我们,程序员和程序员,是其中最疯狂的部分之一<3


fab*_*oti 8

根据我的理解,如果另一个分支可以访问要删除的分支,则可以使用安全删除它

git branch -d [branch]
Run Code Online (Sandbox Code Playgroud)

你的工作不会丢失.请记住,分支不是快照,而是指向快照的指针.因此,当您删除分支时,您删除了一个指针.

如果删除另一个分支无法访问的分支,您甚至不会失去工作.当然,它不会像检查提交哈希那么容易,但你仍然可以做到.这就是为什么Git无法删除使用无法访问的分支的原因-d.相反,你必须使用

git branch -D [branch]
Run Code Online (Sandbox Code Playgroud)

这是Scott Chacon关于Git的必看视频的一部分.当他谈到分支机构以及如何删除它们时,请在58:00分钟检查.

与GitHub的Scott Chacon一起介绍Git

  • 这有助于回答这个问题吗? (7认同)
  • 告诉提问者分支不包含内容但实际上是指针.你不需要害怕删除分支..你可以创建新的指向与删除的一个提交相同的提交....哇!我还记得我在问这个问题的时候.好时光回到2012年! (6认同)
  • 不得不滚动三个屏幕才终于找到解决问题的答案:删除分支只是删除一个指针。这里没有数据丢失的情况,唯一要恢复的是它指向哪里。直接进入“reflog”的答案简直是矫枉过正。 (4认同)

Pat*_*aar 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
Run Code Online (Sandbox Code Playgroud)

现在根据提交注释查找git commit id(GIT-SHA)并在下面的命令中使用它.使用之前找到的GIT-SHA签出一个名为NEW-BRANCH的新分支:

$ git checkout -b NEW-BRANCH GIT-SHA
Run Code Online (Sandbox Code Playgroud)


saj*_* tm 7

要恢复已删除的分支,首先查看 reflog 历史记录,

git reflog -n 60
Run Code Online (Sandbox Code Playgroud)

其中 n 指的是最后 n 次提交。然后找到合适的头部并使用该头部创建一个分支。

git branch testbranch HEAD@{30}
Run Code Online (Sandbox Code Playgroud)


uyg*_*beg 7

确保在本地执行所有这些操作,并在推送到 Bitbucket Cloud 之前确认您的存储库处于您想要的状态。克隆您当前的存储库并首先测试这些解决方案也可能是一个好主意。

  1. 如果您刚刚删除了分支,您将在终端中看到如下内容:
    Deleted branch <your-branch> (was <sha>)
Run Code Online (Sandbox Code Playgroud)

2.要恢复分支,请使用:

    git checkout -b <branch> <sha>
Run Code Online (Sandbox Code Playgroud)

如果您不知道头顶上的“sha”,您可以:

  1. 使用以下命令在已删除分支的尖端找到提交的“sha”:
    git reflog
Run Code Online (Sandbox Code Playgroud)
  1. 要恢复分支,请使用:
    git checkout -b <branch> <sha>
Run Code Online (Sandbox Code Playgroud)

如果您的提交不在您的 reflog 中:

  1. 您可以尝试通过将分支重置为使用以下命令找到的提交的 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
Run Code Online (Sandbox Code Playgroud)

2. 然后,您可以使用以下方法之一显示每个提交:

    git log -p <commit>
    git cat-file -p <commit>
Run Code Online (Sandbox Code Playgroud)


bor*_*ght 5

如果您删除了分支并忘记了它的提交 ID,则可以执行以下命令:

git log --graph --decorate $(git rev-list -g --all)
Run Code Online (Sandbox Code Playgroud)

在此之后,您将能够看到所有提交。然后你可以做git checkout这个 id 并在这个提交下创建一个新分支。