V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
tlerbao
V2EX  ›  git

git reset --hard 求救哈

  •  1
     
  •   tlerbao · 2022-04-23 16:13:48 +08:00 · 4944 次点击
    这是一个创建于 705 天前的主题,其中的信息可能已经有所发展或是发生改变。

    脑子抽筋,执行了 git reset --hard xxx

    现在暂存区的所有没提交的修改都没了,

    求救怎么恢复。

    54 条回复    2022-04-25 21:33:48 +08:00
    IceBay
        1
    IceBay  
       2022-04-23 16:15:00 +08:00
    看看 IDE 里有没有记录吧
    v2kt
        2
    v2kt  
       2022-04-23 16:15:57 +08:00
    idea 文件历史记录
    hxy100
        3
    hxy100  
       2022-04-23 16:16:26 +08:00
    不出意外应该是救不了了,如果远端仓库没备份的话,只能试试数据恢复软件。
    villivateur
        4
    villivateur  
       2022-04-23 16:18:52 +08:00 via Android
    立刻断电,硬盘拆下来到另一台电脑做数据恢复
    litujin1123
        5
    litujin1123  
       2022-04-23 16:20:48 +08:00   ❤️ 2
    git reflog 应该能看到每次的操作 id ,可以回到那个 id 状态
    xcsoft
        6
    xcsoft  
       2022-04-23 16:21:03 +08:00 via iPhone   ❤️ 1
    试试 reflog
    villivateur
        7
    villivateur  
       2022-04-23 16:24:39 +08:00 via Android
    @xcsoft 他是暂存区文件,肯定没了
    golangLover
        8
    golangLover  
       2022-04-23 16:26:15 +08:00 via Android
    如果你用 jetbrains 就没事了,这钱是不能省的
    tlerbao
        9
    tlerbao  
    OP
       2022-04-23 16:29:02 +08:00
    @golangLover 我用的 phpstorm ,请问有办法恢复吗?
    maninfog
        10
    maninfog  
       2022-04-23 16:31:43 +08:00 via iPhone
    右键项目,然后在 local history 里面看看有没有
    tlerbao
        11
    tlerbao  
    OP
       2022-04-23 16:33:30 +08:00
    @maninfog 牛逼啊 果然有,不过我记得 git reflog 是能恢复的吗?
    baiyi
        12
    baiyi  
       2022-04-23 16:36:06 +08:00
    git reflog 并不记录 add 命令

    但暂存区也是会有 object 文件的,最后实在不行的笨办法也可以根据文件更新时间手动寻找并恢复
    xcsoft
        13
    xcsoft  
       2022-04-23 16:36:56 +08:00
    @villivateur 自己试了下, 的确不行, 只能想其他办法了
    maninfog
        14
    maninfog  
       2022-04-23 16:38:25 +08:00 via iPhone
    git reflog 我理解只会给你提供之前 HEAD 对应的 commit id ,适用于你提交了代码的情况,并且 git 会定期清除一些无用的 commit ,所以还有时限要求
    tlerbao
        15
    tlerbao  
    OP
       2022-04-23 16:42:30 +08:00
    感谢楼上各位,感谢 jetbrains ,感谢 phpstorm ,文件已经恢复了。

    借此讨论下,已经 add 但是还没 commit 的 文件 当 reset --hard 后 真的没有办法通过 git 本身的手段找回吗?

    git reflog 也不行吗?
    wu67
        16
    wu67  
       2022-04-23 16:47:15 +08:00
    reset hard 本来就是硬重置, git 本身肯定没法找回了...得借助另外的工具... 所以相应的, reset 还有 soft mix...
    msg7086
        17
    msg7086  
       2022-04-23 17:06:06 +08:00
    没 commit 的文件不属于 git 管辖范围,怎么通过 git 的手段来找回呢。
    首先得让更改进 git 才行啊。
    SenLief
        18
    SenLief  
       2022-04-23 17:08:34 +08:00
    还没 commit 就还没提交给版本库,那肯定没有记录的。
    misdake
        19
    misdake  
       2022-04-23 17:13:55 +08:00
    local history 救过我好几命
    des
        20
    des  
       2022-04-23 18:28:58 +08:00 via iPhone
    暂存区确实没有 reflog ,但是会有 object 文件,我就找回来过,不过挺麻烦的
    461da73c
        21
    461da73c  
       2022-04-23 18:56:32 +08:00
    reflog 肯定没用,只在暂存区,还是重新实现一下吧。
    eggt
        22
    eggt  
       2022-04-23 18:56:54 +08:00 via iPhone
    用 jetbrains 的话,在需要恢复的文件内直接 Ctrl +Z 就能恢复
    HankAviator
        23
    HankAviator  
       2022-04-23 19:02:38 +08:00
    借楼问:如果是重要的变更,是不是要开一个新分支,频繁临时提交,最后再改提交信息,以避免这个问题?
    oneisall8955
        24
    oneisall8955  
       2022-04-23 20:05:17 +08:00 via Android
    用 idea 系列的 ide ,只要 local history 没被清除,那还有的救
    molvqingtai
        25
    molvqingtai  
       2022-04-23 20:32:59 +08:00 via Android   ❤️ 1
    本人亲测,只有 add 也可以找回,用这个脚本
    https://github.com/ethomson/git-recover
    christin
        26
    christin  
       2022-04-23 21:30:02 +08:00 via iPhone
    @tlerbao #11 你是用 local history 回复的吗? 做个备份
    Rache1
        27
    Rache1  
       2022-04-23 23:04:39 +08:00
    @HankAviator

    ”借楼问:如果是重要的变更,是不是要开一个新分支,频繁临时提交,最后再改提交信息,以避免这个问题?“

    A:良好的 Git 使用习惯就是应该每完成一个小的功能点就 commit 的一下,以后找起来也方便,既然都已经觉得是重要的了,就更要谨慎操作每一步了。其实除了这种误操作执行 git 命令的,还有更要命的就是掉盘,会有概率因文件被占用导致填零 😂
    Licsber
        28
    Licsber  
       2022-04-23 23:24:40 +08:00
    https://www.yuque.com/licsber/blog/pl88o4

    果然。。大家总会在差不多的时间碰到差不多的问题
    phithon
        29
    phithon  
       2022-04-24 01:06:56 +08:00
    恭喜
    FrankHB
        30
    FrankHB  
       2022-04-24 03:50:19 +08:00
    没事整什么 stash ,又低效又难用。同样没备份,hg mq 不知高哪去了。
    不用 stash ,老实多 commit ,直球 reset 也无所谓,反正能 reflog 。
    FrankHB
        31
    FrankHB  
       2022-04-24 03:59:47 +08:00
    如果说的是 staging area ,这货就不配叫暂存区,特么根本就没存内容。
    这个多此一举模拟 GUI 的 checkbox list 的二缺设计……算了不浪费口水了,还是多 commit 吧。。。
    硬要模拟 index 也是被 hg mq 吊打,人还能不止一个……
    ElmerZhang
        32
    ElmerZhang  
       2022-04-24 09:13:09 +08:00
    @FrankHB hg mq 这么 NB ,怎么还没把 git 干掉
    kestrelBright
        33
    kestrelBright  
       2022-04-24 11:06:40 +08:00
    local history
    littlewing
        34
    littlewing  
       2022-04-24 11:12:23 +08:00
    @HankAviator 难道不应该是任何变更都是新开一个分支吗
    charlie21
        35
    charlie21  
       2022-04-24 11:28:22 +08:00
    后续怎样,在主分支上将此次修改的最终结果 git merge 进来?新开分支上的 commit 历史怎么办 or 丢弃新开分支本身吗
    @littlewing
    Junzhou
        36
    Junzhou  
       2022-04-24 11:45:10 +08:00
    @tlerbao 如果需要回滚并且保留暂存文件,或许你需要的命令是 git reset <commit id>
    crayygy
        37
    crayygy  
       2022-04-24 12:43:16 +08:00
    只能说 Jetbrains 家的 IDE 是最好用的版本控制工具了(?
    HankAviator
        38
    HankAviator  
       2022-04-24 12:51:39 +08:00 via Android
    @littlewing 只是 op 丢未提交的内容这一部分,如果提交了就好找回了,重点是频繁临时提交
    qiyuey
        39
    qiyuey  
       2022-04-24 13:38:21 +08:00
    《论有一个完善的 IDE 的重要性》
    hO0O0
        40
    hO0O0  
       2022-04-24 14:26:41 +08:00
    真幸福,还有机会抢救。我上次脑子抽了直接把.git 给删了,删之前还把代码 stash 了一下,当时心态就崩溃了。。。。
    thulof
        41
    thulof  
       2022-04-24 14:30:52 +08:00
    还有个 lost&found 可以找,add 过的应该都可以找回来
    shenqi
        42
    shenqi  
       2022-04-24 14:31:39 +08:00
    这个目录不要操作任何先。
    复制一份,查看里面的.git ,你能看到类似某个 hasd 的,一个个找出来。
    sola97
        43
    sola97  
       2022-04-24 14:33:20 +08:00
    没事多 commit ,用 interactively rebase 干啥都行
    yuzhouwww
        44
    yuzhouwww  
       2022-04-24 16:01:27 +08:00
    @hO0O0 哈哈哈怎么想的
    Felldeadbird
        45
    Felldeadbird  
       2022-04-24 16:11:45 +08:00
    从楼主的教训得出:没事操作 reset 干啥。
    zhuweiyou
        46
    zhuweiyou  
       2022-04-24 16:13:34 +08:00
    如果用的是 JB IDE,可以在 local history 里找到
    ooee2016
        47
    ooee2016  
       2022-04-24 16:25:16 +08:00
    git reflog show [branch-name]
    试试能不能找到
    FrankHB
        48
    FrankHB  
       2022-04-24 16:38:25 +08:00
    @ElmerZhang hg mq 一点都不 nb ,只不过 hg CLI 的一些基础设计真没 git CLI 设计得那么傻缺,拿过来开箱即用而体现出日用体验优势了。
    要干掉也是 hg 整个干掉 git ,不过 GitHub dssq 呗……(这种 SO/YC 之类的一搜一大把就不具体引用了。)要我说就是绝大多数日常用户甚至都还没到用出差别的水平(除了 hg 存小文件效率和 git 断点续传更欠扁的个别问题),用哪个基本就是随大流,git 更网红所以更常见罢了。
    另外现在 mq 是 hg 官方都不建议用了( www.mercurial-scm.org/wiki/MqExtension )。毕竟 mq 不是为了体现竞品傻缺发明出来的,而是为了替代早年 hg 没有 rebase 。这又是因为 hg 早年排斥修改历史的传统。然后这里 hg 还是怂了,于是有了 strip 有了 histedit 有了 rebase ,所以修改历史这个最主要的目的就用不上 mq 了。mq 仍然有用,主要适合专业对付 patch series 的 maintainer ,而 git 核心用户一开始也强调对了这个需求,并且设计得并不傻缺——直接开 branch ( hg 对应 git branch 的 bookmark 也不是一开始有的),处理 patch queue 时跟 hg mq 的实际日常用法大同小异;种种因素使 git 中一直有(不严格)对应的功能,但具体用法反而没那么大存在感(间接增长了类似 OP 这里的问题)。
    这里鼓励 git 多 commit 也不可能是一个 branch 上蹲点(这里也有不少人表示新开 branch 算是常识了),所以核心用法跟 mq 差不多(只不过不强调是 patch )。
    PPing520
        49
    PPing520  
       2022-04-24 21:17:18 +08:00
    我也出过类似的问题,后来写了这个😂 https://github.com/xuzhongping/rusure
    hpu423
        50
    hpu423  
       2022-04-25 10:08:23 +08:00
    git reset --soft 重置 HEAD,与上一次 commit 保持一致,暂存区和工作区不变
    你这种应该用--soft
    git 我自荐看看我整理的 git 手册 https://cheatsheet.wang/
    nothingistrue
        51
    nothingistrue  
       2022-04-25 12:52:51 +08:00
    reset --hard 的意图就是丢弃当前工作回到以前的某个状态,所以在执行之前一定要确认还没提交 /stash 的内容,确实是要丢弃的,如果不是那就先 stash 或提交。
    lechain
        52
    lechain  
       2022-04-25 13:39:54 +08:00 via Android
    @tlerbao “已经 add 但是还没 commit 的 文件 当 reset --hard 后 真的没有办法通过 git 本身的手段找回吗?”

    git 管不了这个
    sockball07
        53
    sockball07  
       2022-04-25 20:11:28 +08:00
    如果还记得改了哪些文件 本地历史还能救回一些
    hlx
        54
    hlx  
       2022-04-25 21:33:48 +08:00
    不要让代码在你的电脑上过夜, 哈哈, 没事就 commit
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2635 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 15:50 · PVG 23:50 · LAX 08:50 · JFK 11:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.