V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
coolair
V2EX  ›  问与答

Git 删除本地分支和远程分支后,是不是该分支的 commit 也一并删除了?还能恢复吗?

  •  1
     
  •   coolair · 2019-06-21 19:55:34 +08:00 · 3307 次点击
    这是一个创建于 2018 天前的主题,其中的信息可能已经有所发展或是发生改变。
    14 条回复    2019-06-22 16:14:10 +08:00
    JLNR
        1
    JLNR  
       2019-06-21 20:00:21 +08:00
    可以恢复,reflog 找回你的校验和,checkout 到该提交就可以了。删除的只是一个 label 而已,实际上提交还在
    coolair
        2
    coolair  
    OP
       2019-06-21 21:06:34 +08:00
    @JLNR 是在本地还有记录还可以恢复吗?如果我在电脑 A 创建了分支,然后推到了 remote 服务器,接着又删了本地和远程的分支,并且在本地把这个代码库都删除了。那么如果在电脑 B pull 了最新的代码,已经没有那个分支了,是不是就没机会恢复了?
    我看了下 reflog 只有 master 的记录。
    JLNR
        3
    JLNR  
       2019-06-21 21:11:16 +08:00   ❤️ 1
    @coolair 是的,你说的这种情况是恢复不了的。在 A 电脑上的话可以恢复
    hakono
        4
    hakono  
       2019-06-21 21:41:10 +08:00 via iPhone
    @coolair 不一定。要看远程库怎么清理各种 commit。 有的不会立刻清掉
    coolair
        5
    coolair  
    OP
       2019-06-21 22:09:14 +08:00
    @hakono 怎么看远程怎么清理的?我是自建的 git,用 git init --bare 初始化的仓库。
    coolair
        6
    coolair  
    OP
       2019-06-21 22:10:50 +08:00
    @hakono 用 git push origin :dev 删除的分支。
    msg7086
        7
    msg7086  
       2019-06-21 22:18:40 +08:00   ❤️ 1
    先什么都别管,把服务器上整个目录打包一个 tar 自己备份好。
    这个 tar 里有你丢失的数据,至少保证其他操作不会影响到他。

    然后下个 SmartGit,把 bare 仓库下载回来改名成.git 放在某个目录下,然后用 SmartGit 打开这个目录,切换到 Log 界面,左下角筛选器打开 Recyclable commits,右边应该会出现所有孤立提交记录。自己挨个点击看看,找到要恢复的提交,右键增加分支,起个名字,然后 Remote 菜单里把服务器地址加进来 Push 回去即可。

    不知道还有没有别的 GUI 软件能看 reflog 的,反正我是一直用 SmartGit 的,用用也不要钱,你可以试试。
    comwrg
        8
    comwrg  
       2019-06-21 22:26:00 +08:00 via Android
    git 有个特性就是你不想恢复都难
    Arnie97
        9
    Arnie97  
       2019-06-22 00:22:23 +08:00 via Android
    既然 A 已经删了,登录 remote 那台机器看 reflog 去恢复。此处 B 是没用的。
    coolair
        10
    coolair  
    OP
       2019-06-22 09:50:13 +08:00
    @Arnie97 远程机器上通过--bare 建的仓库不能 reflog 吧?
    msg7086
        11
    msg7086  
       2019-06-22 10:34:41 +08:00
    @coolair 你是试过了才说的还是……?
    coolair
        12
    coolair  
    OP
       2019-06-22 10:49:09 +08:00
    @msg7086 我试过了,按你说的,按你说的那样操作的,把远程仓库下载到本地,重命名为.git 放在一个空目录 A 下,然后用 SmartGit 的 Portable 版本打开目录 A,log 为空。
    coolair
        13
    coolair  
    OP
       2019-06-22 10:49:23 +08:00
    @msg7086 是哪里操作不对吗?
    msg7086
        14
    msg7086  
       2019-06-22 16:14:10 +08:00
    @coolair 那可能……你的 bare 仓库里没有 reflog = =
    可以试试看 git fsck --unreachable,看看能不能救回来什么。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   920 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:44 · PVG 03:44 · LAX 11:44 · JFK 14:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.