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

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

  •  1
     
  •   icebarley · 2021-04-07 23:44:02 +08:00 · 5770 次点击
    这是一个创建于 1086 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位大佬好,我是一个 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 条附言  ·  2021-04-08 22:11:11 +08:00

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

    首先

    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  
       2021-04-07 23:45:51 +08:00
    你 checkout 的时候丢弃修改了? 还是 stash 了? 还是先 commit 再 checkout 了?
    icebarley
        2
    icebarley  
    OP
       2021-04-07 23:50:11 +08:00
    @chinvo 我点太快了,没看清楚,checkout 前没有 commit 的,所以才悲剧了
    msg7086
        3
    msg7086  
       2021-04-07 23:55:24 +08:00 via Android
    没提交的代码部分不归 git 处理,不会保存到.git 数据库中。

    用 git 可以保证数据不丢失,如果你故意不用 git 来管理版本,那 git 也没法帮你恢复数据。
    icebarley
        4
    icebarley  
    OP
       2021-04-08 00:14:47 +08:00
    @msg7086 主要是个人小项目平时没那么复杂,让我产生不用 git 也能好好运作的幻觉,今天这种人为失误操作带来的影响也确实会让我重视起来啦
    BrettD
        5
    BrettD  
       2021-04-08 00:36:21 +08:00 via iPhone
    如果你不 commit 的话是找不回来的
    BrettD
        6
    BrettD  
       2021-04-08 00:36:45 +08:00 via iPhone
    git 只保存你的 commit 历史
    tr1stan
        7
    tr1stan  
       2021-04-08 00:50:59 +08:00
    这个城市又多了一个伤心的人
    momocraft
        8
    momocraft  
       2021-04-08 00:56:25 +08:00
    如果 git add 过 有可能能恢复出来 (到.git 里面找文件日期较新的 tree / blob object)
    先备个份 别抱太大希望
    ch2
        9
    ch2  
       2021-04-08 00:56:45 +08:00 via iPhone
    只有 commit 的才能还原
    zsen
        10
    zsen  
       2021-04-08 01:01:53 +08:00 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  
       2021-04-08 02:24:31 +08:00
    补充一点,不要用 dropbox 保存 git 仓库,文件可能会损坏。好像前两天才在这看到案例。
    NilChan
        12
    NilChan  
       2021-04-08 05:52:44 +08:00 via Android
    没 commit 就 checkout 不会失败吗?
    HeapOverflow
        13
    HeapOverflow  
       2021-04-08 06:13:36 +08:00
    you done fucked up.
    xiadong1994
        14
    xiadong1994  
       2021-04-08 07:13:18 +08:00
    你 checkout 有冲突的的话是会失败的啊,没冲突你的修改应该还在但是是基于三个月前的 master 的。而且你的描述我也没看懂,什么叫“最近 commit 的都跑到总项目文件这里了”,commit 是怎么跑到文件里的?
    vicnicLight007
        15
    vicnicLight007  
       2021-04-08 07:27:18 +08:00 via iPhone
    还是要用 sourceTree 稳当
    LokiSharp
        16
    LokiSharp  
       2021-04-08 08:10:22 +08:00 via Android
    有事没事就要 commit 一下啊…
    iminto
        17
    iminto  
       2021-04-08 08:27:56 +08:00   ❤️ 2
    jetbrains 才是你的正确选择。IDE 自带历史记录和本地版本记录,即使你没有 commit,也不会丢数据
    nieyujiang
        18
    nieyujiang  
       2021-04-08 08:33:57 +08:00 via iPhone
    @iminto #17 然而,jb 家的 appcode 非常难用,xcode 比他好用无数倍🤣🤣🤣
    nielinjie
        19
    nielinjie  
       2021-04-08 08:40:20 +08:00
    既然 Mac, 不是有 Time Machine 么?
    Mutoo
        20
    Mutoo  
       2021-04-08 08:41:38 +08:00
    jetbrains 家的 IDE 自带 local history 是独立于版本控制存在的。救了我好几次命。
    sunnywqf
        21
    sunnywqf  
       2021-04-08 08:43:52 +08:00 via iPhone
    Xcode 的 undo 能找回来不?
    hash
        22
    hash  
       2021-04-08 08:53:01 +08:00   ❤️ 1
    命令行才是正解,从根本上避免瞎点按钮造成的问题
    RedBeanIce
        23
    RedBeanIce  
       2021-04-08 09:01:20 +08:00 via iPhone
    @nieyujiang,。。appcode 是智能提示等智能使用吗,,,,本地存储历史 show history 或许可以救题主,appcode 智能提示或许不行
    rationa1cuzz
        24
    rationa1cuzz  
       2021-04-08 09:19:45 +08:00
    没有 git add 没有备份 无解
    sutra
        25
    sutra  
       2021-04-08 09:40:06 +08:00
    如果有 TimeMachine,还能找回来。

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

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

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

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

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

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

    我最后通过 @zsen 大佬提供的链接恢复了!感恩
    djs
        49
    djs  
       2021-04-08 23:39:16 +08:00
    自动 stash 保命了一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2887 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 14:19 · PVG 22:19 · LAX 07:19 · JFK 10:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.