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

git 重置到其他远程分支的代码后还能恢复吗?重置后,没看到历史,内心是崩溃的。

  •  
  •   bbbb · 2016-12-22 16:50:32 +08:00 · 4662 次点击
    这是一个创建于 2892 天前的主题,其中的信息可能已经有所发展或是发生改变。

    情况是这样的,在一个 git 仓库添加了两个远程仓库地址 A 和 B ,今天重置的时候不小心将 A 的历史重置到 B 仓库去了,导致 B 仓库 15 号以后提交的历史都没了,而 A 又是远程仓库,一直在更新, B 是在 A 上的分支, A 并没有 pull 到本地,提交的历史其实只存在远程分支上。

    平时都有随时 push 的习惯,这段时间不知道怎么回事,没有 push ,远程仓库也是只有 15 号及以前的代码。在提交历史里面没有任何记录。

    这次重置保留到了最后一次 Push 到 B 上面的历史,疑似跟远程分支有关,这次重置是否改写了 git 的提交记录?

    问题到不严重,这几天时间都花在找问题,梳理逻辑上了,花点时间代码就回来了。

    想了解下,这样的情况下,还能找回之前的代码了吗?当看到没有历史记录的时候,我其实基本是放弃了的,当时傻逼的把工程关了,不然可能还能在工程里把代码找回些。

    看到没有历史记录的瞬间,内心不知道怎么形容。。。

    25 条回复    2016-12-23 16:27:37 +08:00
    skydiver
        1
    skydiver  
       2016-12-22 16:55:11 +08:00   ❤️ 1
    git reflog 找到之前的那个提交的 sha1 ,然后 co 过去就行了
    dong3580
        2
    dong3580  
       2016-12-22 16:58:03 +08:00
    前天遇到.
    git log 看不到, 欲哭无泪,最后发现线上分支可以看到 log,然后切到线上写的变动的那个 sha1 上,拿到代码后对比线下重新覆盖上了.
    besto
        3
    besto  
       2016-12-22 17:03:30 +08:00
    前提是没有做 git gc ,而没 gc 就太简单了。
    1L 的做法就可以,你可以选择用 git fsck --lost-found 找到最后一个提交的 commit id 就可以。
    bbbb
        4
    bbbb  
    OP
       2016-12-22 17:12:42 +08:00
    @skydiver
    @besto 好,我试试。谢谢了。看到了历史记录了。
    bbbb
        5
    bbbb  
    OP
       2016-12-22 17:13:17 +08:00
    @dong3580 我没有提交到线上,以后还是的提交了
    bbbb
        6
    bbbb  
    OP
       2016-12-22 17:18:24 +08:00
    @skydiver
    @dong3580
    @besto 谢谢了,找回来了,我还以为看不到历史就找不回来了。一会还得多学习。
    wwulfric
        7
    wwulfric  
       2016-12-22 17:50:20 +08:00
    这种问题 3 条路:
    wwulfric
        8
    wwulfric  
       2016-12-22 17:51:36 +08:00
    1. git reflog (基本上这个就可以了,不小心强推分支也可以靠它恢复)
    2. 没有提交远程的话,从远程重新 fetch
    3. 提交远程的话,从别的同事那里恢复
    bbbb
        9
    bbbb  
    OP
       2016-12-22 18:48:49 +08:00
    @wwulfric 嗯,思路学习了。
    以后就得多提交,提交了就有救。
    git 现在没有研究得太多,出现问题后,第一时间保留好分支,上网查了下,关键字没弄对。没查到,恢复后,又重新查了下 git 恢复分支就找到了。
    其实出现问题后,虽然不是什么大问题,但是说不出的感觉。。。
    Rice
        10
    Rice  
       2016-12-22 19:00:18 +08:00 via iPhone
    当初第一次用 git 的时候,我就模拟了开发时可能遇到的情况各种瞎整。最后我发现 git reflog 这个命令绝大多数情况可以恢复历史。
    然后没提交的代码整没了就好像没办法恢复。
    darrenfang
        11
    darrenfang  
       2016-12-22 19:06:56 +08:00 via iPhone
    git reflog
    darrenfang
        12
    darrenfang  
       2016-12-22 19:08:40 +08:00 via iPhone
    @Rice 没提交的也可以找回,但是可能不完整,好像是这个命令 git fsck --lost-found
    hronro
        13
    hronro  
       2016-12-22 19:12:56 +08:00 via Android
    借楼问个问题,是我以前遇到的问题。当时在修改了大量代码后,在没有 commit 也没有 add 的情况下切换到别的分支去了,导致修改全丢了。当时是花了两天时间手动把所有的代码重新再写了一遍,不知道各位老司机还有什么别的方法没😂
    50vip
        14
    50vip  
       2016-12-22 19:13:18 +08:00
    你是 git push origin master -f ?
    SoloCompany
        15
    SoloCompany  
       2016-12-22 21:26:25 +08:00
    @hronro 你难道 checkout 命令在分支后面多打了个点?貌似 checkout 命令这个行为是挺坑爹的。明明是 svn revert 命令要比 git checkout 合理的多
    mingyun
        16
    mingyun  
       2016-12-22 23:02:18 +08:00
    @skydiver 老司机
    lifanxi
        17
    lifanxi  
       2016-12-22 23:38:01 +08:00
    看到 git 误操作的问题,我就推荐一下这个:
    http://sethrobertson.github.io/GitFixUm/fixup.html
    darrenfang
        18
    darrenfang  
       2016-12-23 07:32:29 +08:00 via iPhone
    @hronro 没有 add 的没试过,上次 add 之后 git reset --hard 了😂然后在 lost found 里面一个个找回来了
    bbbb
        19
    bbbb  
    OP
       2016-12-23 09:10:30 +08:00
    @Rice 哈哈哈,,我也想到了当初开始用 git 的时候,各种冲突,一直在想,这么傻逼的玩意有啥好用的。。。曾经还把一份代码复制多分。慢慢的发现是自己傻逼了。
    bbbb
        20
    bbbb  
    OP
       2016-12-23 09:14:11 +08:00
    @lifanxi 好,先收藏了。我之前也买了一本 git 的书,打算好好学习下 git 。。。只不过一直没看,看来还是得抽时间了解下。
    bbbb
        21
    bbbb  
    OP
       2016-12-23 09:15:13 +08:00
    @darrenfang 我用的这个命令找回来的, git fsck --lost-found 也看了,记录不好区分是哪一次的。
    bbbb
        22
    bbbb  
    OP
       2016-12-23 09:16:03 +08:00   ❤️ 1
    @hronro 用图形话的操作,切换的时候会提示。
    wweir
        23
    wweir  
       2016-12-23 10:19:02 +08:00 via Android   ❤️ 1
    @hronro
    当前分之有改动的情况下,只能切到没有冲突的分支,这种情况是可以完好切回来的。
    如果有冲突,会提示冲突,切不走的。
    当然,如果是习惯下各种强制性的命令切,那是自作孽,自认倒霉吧。就好比 rm -rf 怪不得别人。

    在公司里,我是一直强烈推荐命令行下用 git 辅助工具如: oh-my-zsh 。不愿意装的话,就 **必须** 做到敲完每个 git 命令之后敲一次 git status
    xiuc001
        24
    xiuc001  
       2016-12-23 14:59:32 +08:00
    只要你的代码提交过,你就能在 git 上找回来,因为 git 会报错所有的历史提交记录
    darrenfang
        25
    darrenfang  
       2016-12-23 16:27:37 +08:00
    @bbbb 对, 我一个个看的😂 还好不多
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1234 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:05 · PVG 02:05 · LAX 10:05 · JFK 13:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.