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

Xcode 的 git,没保存不小心 checkout 后还能救吗?

  •  1
     
  •   icebarley · 14 天前 · 3397 次点击

    各位大佬好,我是一个 git 小白,平时写 APP 没太注重 git 这块知识,今天想给 APP 写个新功能,想添加一个分支。

    然后进入了 Xcode 的 git 界面,发现 master 这个分支的版本是三个月前,最近 commit 的都跑到总项目文件这里了(图片的蓝色文件夹处),然后想着 checkout 应该就是合并一下,可以把最近的 commit 合并到 master 里,之后就悲剧了,整个项目回到了三个月前的样子。

    截屏 2021-04-07 下午 11.17.45.png

    我写 APP 比较佛系,晚上偶尔写写新功能,平时没有 add 、commit 的习惯,几乎都是版本快发布前才做这些操作。现在就是 dropbox 保存了 3 天前的文件,最坏的结果就是重新写这 3 天的代码。不过我看了一下项目下面 .git 这个文件夹,里面貌似还有 objects 、index 这些文件,不知道能不能根据这些恢复我 checkout 前的代码呢?

    有看到说 PyCharm 、jetbrains 这些软件能恢复历史记录,那如果我把 .git 导入这两个软件是不是也能恢复呢?求大佬赐教!

    第 1 条附言  ·  13 天前

    感恩各位的帮助,最后通过以下方法恢复了。

    首先

    git reflog --all

    显示最近的所有记录,这里就能看到最近3个月内的所有commit,发现里面有一个 refs/stash ,SHA1为 c8d2431 ,猜测就是Xcode在checkout前自动保存的暂存部分。

    然后

    git show c8d2431

    显示这个部分里面的详细代码操作,发现确实是之前没保存的内容,然后就可以确定恢复了。

    最后

    git reset --hard c8d2431

    恢复到这个stash版本,打开Xcode发现所有一切都回来了,失而复得的感觉太棒了!

    49 条回复    2021-04-08 23:39:16 +08:00
    chinvo
        1
    chinvo   14 天前
    你 checkout 的时候丢弃修改了? 还是 stash 了? 还是先 commit 再 checkout 了?
    icebarley
        2
    icebarley   14 天前
    @chinvo 我点太快了,没看清楚,checkout 前没有 commit 的,所以才悲剧了
    msg7086
        3
    msg7086   14 天前 via Android
    没提交的代码部分不归 git 处理,不会保存到.git 数据库中。

    用 git 可以保证数据不丢失,如果你故意不用 git 来管理版本,那 git 也没法帮你恢复数据。
    icebarley
        4
    icebarley   14 天前
    @msg7086 主要是个人小项目平时没那么复杂,让我产生不用 git 也能好好运作的幻觉,今天这种人为失误操作带来的影响也确实会让我重视起来啦
    BrettD
        5
    BrettD   14 天前 via iPhone
    如果你不 commit 的话是找不回来的
    BrettD
        6
    BrettD   14 天前 via iPhone
    git 只保存你的 commit 历史
    tr1stan
        7
    tr1stan   14 天前
    这个城市又多了一个伤心的人
    momocraft
        8
    momocraft   14 天前
    如果 git add 过 有可能能恢复出来 (到.git 里面找文件日期较新的 tree / blob object)
    先备个份 别抱太大希望
    ch2
        9
    ch2   14 天前 via iPhone
    只有 commit 的才能还原
    zsen
        10
    zsen   14 天前 via iPhone
    https://www.google.com
    /search?q=git+%E6%89%BE%E5%9B%9E%E6%9C%AA%E6%8F%90%E4%BA%A4%E7%9A%84%E6%96%87%E4%BB%B6&newwindow=1&safe=strict&source=hp&ei=0eRtYKinKIbr0ATPzbGQDQ&oq=git+%E6%89%BE%E5%9B%9E%E6%9C%AA%E6%8F%90%E4%BA%A4%E7%9A%84&gs_lcp=ChFtb2JpbGUtZ3dzLXdpei1ocBABGAEyBQghEKABMgUIIRCgATIFCCEQoAE6AggAOgQIABAMOgcIIRAKEKABUPsLWLekAWCcxgFoBnAAeAaAAZIBiAGKGJIBBDkuMjCYAQCgAQGwAQA&sclient=mobile-gws-wiz-hp
    Vancion
        11
    Vancion   13 天前
    补充一点,不要用 dropbox 保存 git 仓库,文件可能会损坏。好像前两天才在这看到案例。
    NilChan
        12
    NilChan   13 天前 via Android
    没 commit 就 checkout 不会失败吗?
    HeapOverflow
        13
    HeapOverflow   13 天前
    you done fucked up.
    xiadong1994
        14
    xiadong1994   13 天前
    你 checkout 有冲突的的话是会失败的啊,没冲突你的修改应该还在但是是基于三个月前的 master 的。而且你的描述我也没看懂,什么叫“最近 commit 的都跑到总项目文件这里了”,commit 是怎么跑到文件里的?
    vicnicLight007
        15
    vicnicLight007   13 天前 via iPhone
    还是要用 sourceTree 稳当
    LokiSharp
        16
    LokiSharp   13 天前 via Android
    有事没事就要 commit 一下啊…
    iminto
        17
    iminto   13 天前   ❤️ 2
    jetbrains 才是你的正确选择。IDE 自带历史记录和本地版本记录,即使你没有 commit,也不会丢数据
    nieyujiang
        18
    nieyujiang   13 天前 via iPhone
    @iminto #17 然而,jb 家的 appcode 非常难用,xcode 比他好用无数倍🤣🤣🤣
    nielinjie
        19
    nielinjie   13 天前
    既然 Mac, 不是有 Time Machine 么?
    Mutoo
        20
    Mutoo   13 天前
    jetbrains 家的 IDE 自带 local history 是独立于版本控制存在的。救了我好几次命。
    sunnywqf
        21
    sunnywqf   13 天前 via iPhone
    Xcode 的 undo 能找回来不?
    hash
        22
    hash   13 天前   ❤️ 1
    命令行才是正解,从根本上避免瞎点按钮造成的问题
    RedBeanIce
        23
    RedBeanIce   13 天前 via iPhone
    @nieyujiang,。。appcode 是智能提示等智能使用吗,,,,本地存储历史 show history 或许可以救题主,appcode 智能提示或许不行
    rationa1cuzz
        24
    rationa1cuzz   13 天前
    没有 git add 没有备份 无解
    sutra
        25
    sutra   13 天前
    如果有 TimeMachine,还能找回来。

    另外不要把 git repo 放在 iCloud 文件同步的地方,会有奇奇怪怪的问题。
    z1113456051
        26
    z1113456051   13 天前
    用文本编辑可以找回
    hlx
        27
    hlx   13 天前
    不要让代码在你的电脑上过夜, 没事就 commit, push, 一个功能完成后整理下 commit 历史记录就行了
    ZHanYao
        28
    ZHanYao   13 天前
    在 Xcode 上切换分支只有两种选项“Cancel”和“Stash and Checkout”,也就是说必须 stash 才能 checkout 成功。你在 Xcode 的 git 列表下的“Stashed Changes”文件夹下应该能看到
    WillBC
        29
    WillBC   13 天前
    歪个楼,Emacs 的 Undo fu session 插件可以在重启 Emacs/Mac 后照旧 undo redo,独立于 git 的。
    https://gitlab.com/ideasman42/emacs-undo-fu-session
    WillBC
        30
    WillBC   13 天前
    nieyujiang
        31
    nieyujiang   13 天前 via iPhone
    @RedBeanIce #23 这玩意每次打开,就是一顿疯狂的索引,代码提示也不咋地🌚
    amoyiki
        32
    amoyiki   13 天前
    git reflog 看看 checkout 之前的操作有没有 commit 记录
    icebarley
        33
    icebarley   13 天前
    @xiadong1994 可能是我没表达清楚,昨晚没 checkout 之前,点击蓝色那个文件夹名,就能看到最近 3 个月提交的 commit ;而点击 master 分支,只能看到 3 个月之前的 commit 内容,也就是说 3 个月前不知道我的什么神奇操作,变成这样子,也就是说我的工作区不在 master,所以 checkout 到 master 之后就导致了最近 3 个月的 commit 不见了。

    @ZHanYao 今晚回家我再去仔细看看,但是昨晚出问题之后我也看过这里,好像都变成了 master 分支下的内容,记录的操作都是 3 个月前的了。。。

    总之谢谢各位解答,好在这个亏不算太大,这次事件也让我恶补了 git 的知识,挺划算的哈哈哈😂
    icebarley
        34
    icebarley   13 天前
    @WillBC @zsen @z1113456051 @amoyiki 今晚试试,感谢
    zhuweiyou
        35
    zhuweiyou   13 天前
    不太了解 xcode . 如果是 jb 系列的 IDE, 有自带的 local history 可以看到每次的改动和时间.
    ZHanYao
        36
    ZHanYao   13 天前
    @icebarley #33 假设你 A 分支最后一次提交是在 3 个月前,当你在 A 分支上有更改并且没提交的情况下想要切换到 B 分支,这时就如我在#28 楼说的“必须 stash 才能 checkout 成功”,Xcode 会将你在 A 分支上所有更改记录保存在“Stashed Changes”文件夹下。如果你想要将此更改恢复到 A 分支上,你只需要切回 A 分支并在 Stashed Changes 文件夹下找到对应的更改记录,右击选择“Apply Stashed Changes...”即可恢复。
    MintZX
        37
    MintZX   13 天前
    如果你没有 stash 或者 commit 就不小心删除了文件,请善用 IDE 的 revert 功能。至少 Jetbrain 的 IDE 是有这个功能的。直接一键 revert 所有代码更改。
    h123123h
        38
    h123123h   13 天前
    找找 local history 吧
    LINAICAI
        39
    LINAICAI   13 天前
    没 commit 不会有记录,除非做了 git stash push
    Vitta
        40
    Vitta   13 天前
    我有次 Commit 了忘了 Push 了,回家重装了系统
    NEVERCODE
        41
    NEVERCODE   13 天前
    @Vitta 很惨,但是有点好笑
    Rocketer
        42
    Rocketer   13 天前 via iPhone
    按 git 的最佳实践,应该每完成一个改动就 commit 一下,学名叫原子性( atomic )。

    习惯这么做以后,就不会发生这种惨剧了。
    xz410236056
        43
    xz410236056   13 天前
    sourcetree 不香吗?这么多年了就没用过 xcode 的 git
    mcluyu
        44
    mcluyu   13 天前
    没 commit 就 checkout 会提示你先 stash, 往下 看,下面有个 Stashed Changes,checkout 回你想 apply stash 的分支,然后 apply stash, 然后 commit, 再 merrge “branchXX” into “branchXX1”

    没有 stashed changes 那就不知道了。
    beichenhpy
        45
    beichenhpy   13 天前
    无了
    Felldeadbird
        46
    Felldeadbird   13 天前
    大概率没了。
    看看 xcode 有没有提供 local history (本地文件历史)。 有一些 IDE,就算你文件被 checkout,你复建一样的文件。然后在本地文件历史,还是可以回滚到代码(前提 IDE 一直没关闭,且不一定回滚到)。

    下次 checkout 前,检查清楚在执行吧。我一般不用 IDE 的 GIT 。要么第三方 GUI,要么命令行。
    kiripeng
        47
    kiripeng   13 天前
    xcode 没有 local history 把
    icebarley
        48
    icebarley   13 天前
    @ZHanYao @mcluyu
    谢谢两位大佬提供的思路,虽然 Xcode 看不到之前的 Stashed Changes 的内容,但是 Xcode 里 checkout 前会 stash 这个思路给了很大的帮助。

    我最后通过 @zsen 大佬提供的链接恢复了!感恩
    djs
        49
    djs   13 天前
    自动 stash 保命了一下
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1456 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 17:16 · PVG 01:16 · LAX 10:16 · JFK 13:16
    ♥ Do have faith in what you're doing.