代码之家  ›  专栏  ›  技术社区  ›  prosseek

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

  •  880
  • prosseek  · 技术社区  · 14 年前

    如果我跑了 git branch -d XYZ

    17 回复  |  直到 7 年前
        1
  •  2182
  •   Brady Dowling    3 年前

    是的,你应该能做到 git reflog --no-abbrev 在已删除分支的顶端找到提交的SHA1,然后 git checkout [sha] git checkout -b [branchname] 从那里重新创建分支。


    如果您刚刚删除了分支,您将在终端中看到类似的内容 Deleted branch <your-branch> (was <sha>) <sha> 在这一行中:

    git checkout -b <your-branch> <sha>
    
        2
  •  174
  •   Philippe    5 年前

    大多数情况下,无法访问的提交都在reflog中。所以, 首先要看一下reflog 使用命令 git reflog (其中显示 HEAD ).

    如果提交是仍然存在的特定分支的一部分,那么使用命令可能更容易 git reflog name-of-my-branch . 它也适用于远程,例如,如果您强制推送(其他建议: 总是 git push --force-with-lease 相反,它可以更好地防止错误,并且更具可恢复性)。


    (可能是因为被不在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
    

    git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560
    

    找到提交后,使用以下命令在此提交上创建分支:

    git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560
    

    对于那些在Windows下并且喜欢gui的用户,您可以使用 GitExtensions 通过使用功能 Repository => Git maintenance Recover lost objects...


    类似的命令可轻松恢复已删除的暂存文件: https://stackoverflow.com/a/58853981/717372

        3
  •  51
  •   Brent Bradburn    9 年前

    如果您喜欢使用GUI,可以使用gitk执行整个操作。

    gitk --reflog
    

    Create new branch .

        4
  •  29
  •   Dmitri Zaitsev dpedro    9 年前

    git checkout <sha>
    git checkout -b <branch>
    

    git checkout -b <branch> <sha>
    

    将您与可能忘记提交的所有最近更改一起移动到新分支。这可能不是您的意图,尤其是在失去分支后处于“恐慌模式”时。

    A 更清洁(更简单)的解决方案 似乎是唯一的班轮(在你找到 <sha> 具有 git reflog ):

    git branch <branch> <sha>
    

    现在,当前分支和未限制的更改都不会受到影响。相反,只有一个新的分支会一直创建到 < .

    <sha> 和新的分支名称,直到你得到它的权利。

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

    git branch -m <restored branch> <final branch>
    

    <sha> ,因此请明智地命名您的承诺:)

        5
  •  14
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    tfe answer git-resurrect.sh contrib/ Git源的面积(英寸)吉特.git存储库),这可能会对您有所帮助。

    git-resurrect <name> 试图找到树枝尖端的痕迹 打电话 <name> 搜索签出消息,并使用 -r 同时合并消息。与 -m -t ,将扫描所有引用的历史记录 Merge <name> into other / Merge <other> into <name> (分别)提交主题 分支机构。

        6
  •  11
  •   Patrick Koorevaar    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
    

    现在根据commit注释查找git commit id(git-SHA),并在下面的命令中使用它。使用以前找到的GIT-SHA签出名为new-branch的新分支:

    $ git checkout -b NEW-BRANCH GIT-SHA
    
        7
  •  9
  •   Community rohancragg    7 年前

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

    从内部 .git/objects 目录运行:

    find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit
    

    我想尝尝这个-压力ct.sh中提到的脚本 Jakub's answer

        8
  •  9
  •   TT--    5 年前

    为了 GitHub 未安装Git的用户:

    使用他们的API 要获取回购相关事件的列表:

    弗斯特

    • 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
    

    最后一步

    • 将“BranchSHA”替换为SHA散列,将BranchName替换为所需的名称(顺便说一句,从web重命名分支是一种很好的方法)。如果你不是太慢,你无论如何都需要提出这个请求。例如,只需将粘贴复制到端子。

    附笔。

    我意识到这可能不是“最简单的解决方案”或“正确的”解决方案,但它是在有人发现它有用的情况下提供的。

        9
  •  8
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    据我所知,如果要删除的分支可以被另一个分支访问,您可以使用

    git branch -d [branch]
    

    你的工作没有丢。请记住,分支不是快照,而是指向快照的指针。所以当你删除一个分支时,你就删除了一个指针。

    如果你删除了另一个分支无法到达的分支,你甚至不会失去工作。当然,这不会像检查提交散列那么容易,但您仍然可以这样做。这就是为什么Git不能删除使用 -d . 相反,你必须使用

    git branch -D [branch]
    

    这是Scott Chacon关于Git的必看视频的一部分。查看58:00分钟,他谈到了分支以及如何删除它们。

    Introduction to Git with Scott Chacon of GitHub

        10
  •  7
  •   Robbie JW Chamly Idunil    5 年前

        Deleted branch <your-branch> (was <sha>)
    

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

        git checkout -b <branch> <sha>
    

        git reflog
    
    1. 要还原分支,请使用:

    如果您的提交不在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
    

    2.然后可以使用以下其中一种方法显示每个提交:

        git log -p <commit>
        git cat-file -p <commit>
    
        11
  •  5
  •   sajin tm    8 年前

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

    git reflog -n 60
    

    其中n表示最后n个提交。然后找到合适的头并用这个头创建一个分支。

    git branch testbranch HEAD@{30}
    
        12
  •  4
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    以下是我如何找到它们的(主要是一个更简单的界面/与答案相关的交互):

    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
    

    输入

        13
  •  3
  •   borkafight    4 年前

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

    git log --graph --decorate $(git rev-list -g --all)
    

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

        14
  •  2
  •   Aljohn Yamaro    6 年前

    大的是的

    遵循以下简单步骤 https://confluence.atlassian.com/bbkb/how-to-restore-a-deleted-branch-765757540.html

    如果您使用的是smartgit,并且已经推送了该分支

        15
  •  2
  •   Ammar Bozorgvar    5 年前

    我在删除分支的计算机上执行了以下操作:

    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

        16
  •  1
  •   itsdarrylnorris Yaniro    9 年前

    首先转到git批量迁移到您的项目,如:

    cd android studio project
    cd Myproject
    then type :
    git reflog
    

    你们都有一个变更列表,参考号取参考号,然后签出
    另一个解决方案是获取参考号并进入androidstudio点击git分支向下,然后点击checkout标签或修订超过参考号,然后lol你就有了分支。

        17
  •  1
  •   meow    8 年前

    如果您的分支没有合并到现有分支,并且它是垃圾收集的,那么您将丢失所有提交,直到分支从现有分支分叉的位置为止。

        18
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    我来到这个网页后,搜索“如何知道什么是删除的分支”。

    如果您转到Git URL,它将如下所示:

    https://your-website-name/orgs/your-org-name/dashboard
    

    然后你可以看到提要,删除了什么,被谁删除了,在最近的过去。

        19
  •  0
  •   MarvinVK    6 年前

    只是使用 git reflog 没有归还 sha 只有 commit id (8个字符长,一个sha长得多)

    所以我用 git reflog --no-abbrev

    git checkout -b <branch> <sha>

        20
  •  0
  •   Community rohancragg    4 年前

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

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

    1. 展开存储库

    2. 您应该看到一个类别列表:分支/贡献者/远程/存储等

    您应该在“分支”或“远程->来源”下找到您的LostSure。希望您能看到一个具有所需名称的分支—如果展开它,您应该会看到在该分支中更改的文件。双击文件名以打开它们,并立即备份该代码。

    如果你没有立即看到你丢失的分支,四处看看,如果你发现了一些有前途的东西,立即打开它并抓取代码。在找到goldenbranch之前,我不得不花了不少时间,即使这样,代码也会丢失最后一次或两次保存(可能是因为我在尝试-a-Branch-Merge-but-uncilly-clicking-Branch-Delete之前未能同步到服务器)。我的搜索被不必要地延长了,因为当我第一次找到分支时,我不完全确定名称是否正确,所以继续寻找,并且花了一些时间重新找到第一个分支。 然后 继续找。)